Como remover valores vazios da multidimensional array em PHP?

Eu estive olhando muitas respostas, mas nenhum deles está trabalhando para mim.

Estes são os dados atribuídos à minha matriz de $quantities :

 Array( [10] => Array([25.00] => 1) [9] => Array([30.00] => 3) [8] => Array([30.00] => 4) [12] => Array([35.00] => ) [1] => Array([30.00] => ) [2] => Array([30.00] => ) ) 

Estou procurando uma maneira de remover os subarrays com valores vazios como [12] [1] e [2] enquanto mantém tudo o resto.

O resultado desejado:

 Array( [10] => Array([25.00] => 1) [9] => Array([30.00] => 3) [8] => Array([30.00] => 4) ) 

Eu tentei muitas das funções nos documentos oficiais da php e nenhum deles funcionou.

Eu usei esse:

 function array_filter_recursive($array, $callback = null) { foreach ($array as $key => & $value) { if (is_array($value)) { $value = array_filter_recursive($value, $callback); } else { if ( ! is_null($callback)) { if ( ! $callback($value)) { unset($array[$key]); } } else { if ( ! (bool) $value) { unset($array[$key]); } } } } unset($value); return $array; } 

Mas ele apenas remove o elemento nas subarquetas; Eu preciso que os subarrays sejam removidos inteiramente.

Eu não quero isso:

 Array( [10] => Array([25.00] => 1) [9] => Array([30.00] => 3) [8] => Array([30.00] => 4) [12] => Array() [1] => Array() [2] => Array() ) 

Pouco atrasado, mas pode ajudar alguém a procurar a mesma resposta. Eu usei essa abordagem muito simples para;

  1. remova todas as chaves de arrays nesteds que não possuem valor, então
  2. remova todos os arrays nesteds vazios.

 $postArr = array_map('array_filter', $postArr); $postArr = array_filter( $postArr ); 

A seguinte function funcionou para o meu caso. Podemos usar uma function recursiva simples para remover todos os elementos vazios da matriz PHP multidimensional:

 function array_filter_recursive($input){ foreach ($input as &$value){ if (is_array($value)){ $value = array_filter_recursive($value); } } return array_filter($input); } 

Então precisamos chamar essa function:

 $myArray = array_filter_recursive($myArray); 

Não tenho certeza se isso é exatamente o que você está procurando.

 function array_remove_null($array) { foreach ($array as $key => $value) { if(is_null($value)) unset($array[$key]); if(is_array($value)) $array[$key] = array_remove_null($value); } return $array; } 

Atualização (correções):

 function array_remove_null($array) { foreach ($array as $key => $value) { if(is_null($value)) unset($array[$key]); if(is_string($value) && empty($value)) unset($array[$key]); if(is_array($value)) $array[$key] = array_remove_null($value); if(isset($array[$key]) && count($array[$key])==0) unset($array[$key]); } return $array; } 

Tenho certeza de que melhor verificar e tornar isso mais robusto pode ajudar a solução.

use array_map () para filtrar todas as matrizes em $ array:

 $newArray = array_map('array_filter', $array); 

Aqui está a demonstração

 $newArray = array_map('array_filter', $array); 

Este syntax é trabalho e ajuda muito caras de agradecimentos completos …

Use array_filter com array_map como abaixo:

 $arr=array_filter(array_map('array_filter', $arr)); 

Isso remove todos os itens com valores nulos recursivamente em matrizes multideminsacionais. Funciona em PHP> = 5.6. Se você quiser remover todos os valores “empry”, substitua !is_null($value) por !empty($value) .

 function recursivelyRemoveItemsWithNullValuesFromArray(array $data = []): array { $data = array_map(function($value) { return is_array($value) ? recursivelyRemoveItemsWithNullValuesFromArray($value) : $value; }, $data); return array_filter($data, function($value) { return !is_null($value); }); } 

Como as sub-redes em sua matriz possuem apenas um elemento, você pode simplificar a abordagem usando qualquer um dos dois methods a seguir. A vantagem lógica é evitar o iterador funcional ( array_filter ) nos elementos de segundo nível. É por isso que current() é mais adequado para esta questão / página.

Código: ( Demo )

 $quantities=[ 10=>['25.00'=>1], 9=>['30.00'=>3], 8=>['30.00'=>4], 12=>['35.00'=>null], 1=>['30.00'=>''], 2=>['30.00'=>null] ]; var_export(array_filter($quantities,function($a){return strlen(current($a));})); 

OU

 foreach($quantities as $key=>$sub){ // could be done "by reference" but that impacts code stability if(!strlen(current($sub))){ // if subarray value has no length unset($quantities[$key]); } } var_export($quantities); 

Ambos produzem o mesmo resultado (que remova propositadamente valores vazios e preserva 0 valores)

 array ( 10 => array ( '25.00' => 1, ), 9 => array ( '30.00' => 3, ), 8 => array ( '30.00' => 4, ), ) 

Nos methods acima, strlen() é usado para verificar os elementos do segundo nível porque o OP apenas listou inteiros como valores “não vazios”. Os leitores de SO futuros podem ter requisitos diferentes com base nos elementos possivelmente mantendo false , null , '0' , 0 , etc. As funções de substituição adequadas para strlen() podem ser: qualquer uma das funções “is_” , vazio () , qualquer uma das funções “ctype” , e muito mais.

Se a matriz de 2º nível do OP tiver mais de um elemento e o OP quis remover todos os elementos nulos zero-ish, false-y, vazios (o que significa que os zeros não são desejados ou garantidos para não ocorrer), a resposta de Alastair F seria a melhor escolha.

Se a matriz de input do OP tivesse um número desconhecido de níveis E os elementos zero-ish / false-y / empty / null devem ser removidos, então a resposta de Reza Mamun é uma abordagem lógica e recursiva.

Meu ponto de vista (e minha motivação por trás de passar tanto tempo e cuidado para responder a esta pergunta) que array_filter() é ganancioso e, se você não tem conhecimento desse comportamento padrão, seu projeto pode emitir dados incorretos silenciosamente. Espero que esta explicação salve programadores algum tempo e conflitos.

    Intereting Posts