Eu me preocupo com quantos programadores inocentemente copiaram / colaram o array_values(array_filter())
método em seus códigos - eu me pergunto quantos programadores inconscientemente tiveram problemas por causa da ganância de array_filter. Ou pior, quantas pessoas nunca descobriram que a função elimina muitos valores da matriz ...
Apresentarei uma alternativa melhor para o processo de duas partes de remoção de NULL
elementos de uma matriz e reindexação das chaves.
No entanto, em primeiro lugar, é extremamente importante enfatizar a natureza gananciosa array_filter()
e como isso pode perturbar silenciosamente seu projeto. Aqui está uma matriz com valores mistos que irá expor o problema:
$array=['foo',NULL,'bar',0,false,null,'0',''];
Os valores nulos serão removidos independentemente de maiúsculas / minúsculas.
Mas veja o que permanece na matriz quando usamos array_values () & array_filter () :
array_values(array_filter($array));
Matriz de saída ($ array):
array (
0 => 'foo',
1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!
Agora veja o que você obtém com meu método que usa array_walk () & is_null () para gerar uma nova matriz filtrada:
array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
Isso pode ser escrito em várias linhas para facilitar a leitura / explicação:
array_walk( // iterate each element of an input array
$array, // this is the input array
function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
if(!is_null($v)){ // this literally checks for null values
$filtered[]=$v; // value is pushed into output with new indexes
}
}
);
Matriz de saída ($ filter):
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => false,
4 => '0',
5 => '',
)
Com meu método, você obtém suas chaves reindexadas, todos os valores não nulos e nenhum dos valores nulos. Um liner limpo, portátil e confiável para todas as suas necessidades de filtragem de nulos de array. Aqui está uma demonstração .
Da mesma forma, se você deseja remover elementos vazios, falsos e nulos (retendo zeros), estes quatro métodos funcionarão:
var_export(array_values(array_diff($array,[''])));
ou
var_export(array_values(array_diff($array,[null])));
ou
var_export(array_values(array_diff($array,[false])));
ou
var_export(array_values(array_filter($array,'strlen')));
Resultado:
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => '0',
)
Finalmente, para quem prefere a sintaxe de construções de linguagem, você também pode simplesmente inserir valores de qualificação em uma nova matriz para emitir novos índices.
$array=['foo', NULL, 'bar', 0, false, null, '0', ''];
$result = [];
foreach ($array as $value) {
if (strlen($value)) {
$result[] = $value;
}
}
var_export($result);