Mi preoccupo di quanti programmatori abbiano innocentemente copiato / incollato il array_values(array_filter())metodo nei loro codici - mi chiedo quanti programmatori abbiano inconsapevolmente incontrato problemi a causa dell'avidità di array_filter. O peggio, quante persone non hanno mai scoperto che la funzione elimina troppi valori dall'array ...
Presenterò un'alternativa migliore per il processo in due parti di rimozione di NULLelementi da un array e reindicizzazione delle chiavi.
Tuttavia, in primo luogo, è estremamente importante sottolineare la natura avida array_filter()e il modo in cui questo può silenziosamente stravolgere il tuo progetto. Ecco un array con valori misti al suo interno che esporrà il problema:
$array=['foo',NULL,'bar',0,false,null,'0',''];
I valori nulli verranno rimossi indipendentemente da maiuscolo / minuscolo.
Ma guarda cosa rimane nell'array quando usiamo array_values () e array_filter () :
array_values(array_filter($array));
Array di output ($ array):
array (
0 => 'foo',
1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!
Ora guarda cosa ottieni con il mio metodo che utilizza array_walk () e is_null () per generare un nuovo array filtrato:
array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
Questo può essere scritto su più righe per facilitare la lettura / spiegazione:
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
}
}
);
Matrice di output ($ filtro):
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => false,
4 => '0',
5 => '',
)
Con il mio metodo ottieni le tue chiavi reindicizzate, tutti i valori non nulli e nessuno dei valori nulli. Un one-liner pulito, portatile e affidabile per tutte le esigenze di filtraggio null di array. Ecco una dimostrazione .
Allo stesso modo, se vuoi rimuovere elementi vuoti, falsi e nulli (mantenendo gli zeri), questi quattro metodi funzioneranno:
var_export(array_values(array_diff($array,[''])));
o
var_export(array_values(array_diff($array,[null])));
o
var_export(array_values(array_diff($array,[false])));
o
var_export(array_values(array_filter($array,'strlen')));
Produzione:
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => '0',
)
Infine, per chiunque preferisca la sintassi dei costrutti del linguaggio, è anche possibile inserire valori qualificanti in un nuovo array per emettere nuovi indici.
$array=['foo', NULL, 'bar', 0, false, null, '0', ''];
$result = [];
foreach ($array as $value) {
if (strlen($value)) {
$result[] = $value;
}
}
var_export($result);