Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carcleo

Filtrando valores

Recommended Posts

Pessoal, esta chegando para mim a seguinte array $_POST

Array
(
   [h_cor1] => 01_BRANCO
   [h_tam1] => 3_4
   [h_qtde1] => 12
   [campo_qtde1] => 

   [h_cor2] => 01_BRANCO
   [h_tam2] => P
   [h_qtde2] => 34
   [campo_qtde2] => 

   [h_cor3] => Preta
   [h_tam3] => 3_4
   [h_qtde3] => 5
   [campo_qtde3] => 4

   [h_cor4] => Preta
   [h_tam4] => P
   [h_qtde4] => 6
   [campo_qtde4] => 

   [h_cor5] => 01_BRANCO
   [h_tam5] => M
   [h_qtde5] => 12
   [campo_qtde5] => 

   [id_produto] => 18
)

Queria filtra ela de forma tal que só ficassem os grupos

   [h_cor+i] => 01_BRANCO
   [h_tam+i] => M
   [h_qtde+i] => 12
   [campo_qtde+i] => 

Onde o campo

   [campo_qtdfe+i] => 

Não viesse vazio. Mas ficasse o ultimo lançamento.

Tipo assim:

Array
(
   [h_cor3] => Preta
   [h_tam3] => 3_4
   [h_qtde3] => 5
   [campo_qtde3] => 4

   [id_produto] => 18
)

Alguma orientação?

 

Vale lembra que esses valores nos nomes dos campos: -1,-2. É devido aos nomes dos campos serem criados em um loop for menos o ultimo campo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gente, fiz o seguinte, para cada grupo de registro

h_cor
h_tam
h_qtde
campo_qtde

Eu adicionei o id do produto também e retirei ele da ultima linha ficando assim

h_prod
h_cor
h_tam
h_qtde
campo_qtde

No final, o $_POST imprimiu assim:

Array
(
   [h_prod1] => 18
   [h_cor1] => 01_BRANCO
   [h_tam1] => 3_4
   [h_qtde1] => 12
   [campo_qtde1] => 

   [h_prod2] => 18
   [h_cor2] => 01_BRANCO
   [h_tam2] => P
   [h_qtde2] => 34
   [campo_qtde2] => 

   [h_prod3] => 18
   [h_cor3] => Preta
   [h_tam3] => 3_4
   [h_qtde3] => 5
   [campo_qtde3] => 2

   [h_prod4] => 18
   [h_cor4] => Preta
   [h_tam4] => P
   [h_qtde4] => 6
   [campo_qtde4] => 

   [h_prod5] => 18
   [h_cor5] => 01_BRANCO
   [h_tam5] => M
   [h_qtde5] => 12
   [campo_qtde5] => 
)

Alguma orientação?

 

Com que eu consigo retirar desse array, todos os grupos em que o campo [campo_qtde + contador] não esta vazio?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use array_filter().

 

Informando um segundo argumento você consegue controlar o critério a ser considerado para que um índice seja mantido ou removido.

 

Nesse caso, você verifica o último índice do elemento corrente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui diferente. Mas valeu a orientação.

 

Segue:

<?php
function filtrar_POST($array) 
{
  $newarray= array();
  if(is_array($array) && count($array) > 0) 
  {
    for ($i==0; $i<=count($array)/5;$i++)
 {
	 if ($array['campo_qtde'.$i]<>"")
	 {
		 $newarray['h_prod'.$i]=$array['h_prod'.$i];
		 $newarray['h_cor'.$i]=$array['h_cor'.$i];
		 $newarray['h_tam'.$i]=$array['h_tam'.$i];
		 $newarray['h_qtde'.$i]=$array['h_qtde'.$i];
		 $newarray['campo_qtde'.$i]=$array['campo_qtde'.$i];

		 array_push($newarray['h_prod'.$i]);
		 array_push($newarray['h_cor'.$i]);
		 array_push($newarray['h_tam'.$i]);
		 array_push($newarray['h_qtde'.$i]);
		 array_push($newarray['campo_qtde'.$i]);
	 }
 }
  }
  return $newarray;
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, sua forma funciona mas é ineficiente pois você está iterando e criando um novo array manualmente via array_push().

 

E parte disso é culpa minha. Como você postou apenas o resultado de $_POST ao invés de seu dump respondi apenas "de olho".

 

Como você tem um único array, você deve quebrá-lo primeiro. Olhando pelo seu último código, posso assumir que sempre haverão 5 índices por grupo e, sendo assim, antes de aplicar array_filter() deve aplicar array_chunk():

 

$data = array_chunk( $data, 5 );

var_dump(

   array_filter(

      $data,

      function( $current ) {

          $last = array_pop( $current );

          return ( ! empty( $last ) );
      }
   )
);

A saída é o terceiro grupo (índice 2), com cor Preta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum. Mas e assim:

Ainda estaria ruim?

<?php
function filtrar_POST($array) 
{
  $newarray= array();
  if(is_array($array) && count($array) > 0) 
  {
    for ($i=1; $i<=count($array)/5;$i++)
 {
	 if ($array['campo_qtde'.$i]<>"")
	 {
		 array_push($newarray,$array['h_prod'.$i]);
		 array_push($newarray,$array['h_cor'.$i]);
		 array_push($newarray,$array['h_tam'.$i]);
		 array_push($newarray,$array['h_qtde'.$i]);
		 array_push($newarray,$array['campo_qtde'.$i]);
	 }
 }
  }
  return $newarray;
}
?>

Será que não daria a mesma saída?

Sim, sempre serão 5 índices.

O primeiro trazendo o numero do produto

O segundo trazendo a cor do produto

O terceiro trazendo o tamanho do produto

O quarto trazendo o estoque do produto

O quintoo trazendo o quantidade de produtos que o cliente adicionou

 

O print_r da tua saída deu assim:

Array
(
   [3] => Array
       (
           [0] => 18
           [1] => 2
           [2] => 1
           [3] => 5
           [4] => 4
       )

   [4] => Array
       (
           [0] => 18
           [1] => 2
           [2] => 6
           [3] => 6
           [4] => 5
       )

)

Dessa forma, terei que saber qual o valor dos índices do array.

Já a minha, saiu assim

Array
(
   [0] => 18
   [1] => 2
   [2] => 1
   [3] => 5
   [4] => 4
   [5] => 18
   [6] => 2
   [7] => 6
   [8] => 6
   [9] => 5
)

Desse jeito que fiz, além de eu criar uma nova array, eu ainda terei que montar um loop para saber se 5 em registro seus valores;

           $j=0;
		for ($i=0;$i<(count($novo_array)/5);$i++)
		{
		  $Query = 
		  "
		   select 
			 estoque.id_produto, 
			 estoque.id_cor,
			 estoque.id_tamanho,
			 estoque.id_estoque
		   from estoque 
		   where 
		     estoque.id_produto = ".$novo_array[$j+$i]." and
		     estoque.id_cor = '".$novo_array[$j+$i+1]."' and
		     estoque.id_tamanho = '".$novo_array[$j+$i+2]."'";

		  $R_Query = $conexao->query($Query);
		  list($prod, $cor, $tamanho, $estoque)=$R_Query->fetch_row();

		  if ($R_Query->num_rows>0)
		  {
			  $_SESSION["MeuCarrinho"]->AdicionarItem($prod,1, $tamanho, $cor, $estoque);
		  }

            $j=$j+4;
			}

Qual você acha que ficaria melhor e porque?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sempre que você puder evitar um loop "literal", isto é, feito pelo PHP, melhor. array_filter() e array_chunk() assim como muitas outras funções de array fazem o loop nos bastidores,na linguagem nativa do PHP, que é mais veloz.

 

E array_push() é reconhecidamente mais lento que a [sintaxe de colchetes].

 

Quanto à diferença de saída, talvez seja pelo terceiro argumento de array_chunk(). Eu não o especifiquei porque pra mim não importava. Mas se você precisa dos índices textuais, sete-o como TRUE.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dessa forma que você fez, sim pois você dá uma volta maior que a necessária para cumprir a tarefa, usando recursos comprovadamente "fominhas", um deles mais de uma vez até.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.