Carcleo 4 Denunciar post Postado Dezembro 6, 2012 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
Carcleo 4 Denunciar post Postado Dezembro 7, 2012 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
Bruno Augusto 417 Denunciar post Postado Dezembro 7, 2012 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
Carcleo 4 Denunciar post Postado Dezembro 7, 2012 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
Bruno Augusto 417 Denunciar post Postado Dezembro 7, 2012 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
Carcleo 4 Denunciar post Postado Dezembro 7, 2012 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
Bruno Augusto 417 Denunciar post Postado Dezembro 7, 2012 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
Carcleo 4 Denunciar post Postado Dezembro 7, 2012 Então do jeito que estou fazendo, para um $_POST de muitos dados estarei perdendo em performance. Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Dezembro 8, 2012 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