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 NULL
elementi 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);