Dopo arrays_filter (), come posso ripristinare i tasti per andare in ordine numbersco a partire da 0

Ho appena usato arrays_filter per rimuovere le voci che avevano solo il valore '' da un arrays, e ora voglio applicare determinate trasformazioni su di esso a seconda del segnaposto a partire da 0, ma purtroppo mantiene ancora l'indice originale. Ho cercato per un po 'e non riuscivo a vedere nulla, forse mi mancava l'ovvio, ma la mia domanda è …

Come posso ripristinare facilmente gli indici dell'arrays per iniziare a 0 e andare nell'arrays NEW, piuttosto che mantenere gli indici precedenti?

Se chiami arrays_values sull'arrays, verrà reindirizzato da zero.

Se si utilizza il filter Array, procedere come segue

 $NewArray = arrays_values(arrays_filter($OldArray)); 

Usa arrays_values() :

 <?php $arrays = arrays('foo', 'bar', 'baz'); $arrays = arrays_filter($arrays, function ($var) { return $var !== 'bar'; }); print_r($arrays); // indexes 0 and 2 print_r(arrays_values($arrays)); // indexes 0 and 1 

Mi preoccupo di quanti programmatori hanno innocentemente copiato / incollato il arrays_values(arrays_filter()) nei loro codici – mi chiedo quanti programmatori hanno inconsapevolmente incontrato problemi a causa dell'avidità di arrays_filter. O peggio, quante persone non hanno mai scoperto che la function cancella troppi valori dall'arrays …

Presenterò un'alternativa migliore per il process in due parti di rimuovere elementi NULL da un arrays e reindicizzare le chiavi.

Tuttavia, in primo luogo, è estremamente importnte sottolineare la natura avida di arrays_filter() e come questo possa scuotere silenziosamente il tuo progetto. Ecco una matrix con valori misti che espongono il problema:

 $arrays=['foo',NULL,'bar',0,false,null,'0','']; 

I valori nulli verranno rimossi indipendentemente da maiuscole / minuscole.

Ma guarda cosa rimane nell'arrays quando usiamo arrays_values ​​() e arrays_filter () :

 arrays_values(arrays_filter($arrays)); 

Array di output ($ arrays):

 arrays ( 0 => 'foo', 1 => 'bar' ) // All empty, zero-ish, falsey values were removed too!!! 

Ora guarda cosa ottieni con il mio metodo che usa arrays_walk () e is_null () per generare un nuovo arrays filtrato:

 arrays_walk($arrays,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}}); 

Questo può essere scritto su più righe per facilitare la lettura / spiegazione:

 arrays_walk( // iterate each element of an input arrays $arrays, // this is the input arrays 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 } } ); 

Array di output ($ filter):

 arrays ( 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, porttile e affidabile per tutte le esigenze di filter nullo degli arrays. Ecco una dimostrazione .



Allo stesso modo, se vuoi rimuovere elementi vuoti, falsi e nulli (mantenendo zero), questi quattro methods functionranno:

 var_export(arrays_values(arrays_diff($arrays,['']))); 

o

 var_export(arrays_values(arrays_diff($arrays,[null]))); 

o

 var_export(arrays_values(arrays_diff($arrays,[false]))); 

o

 var_export(arrays_values(arrays_filter($arrays,'strlen'))); 

Produzione:

 arrays ( 0 => 'foo', 1 => 'bar', 2 => 0, 3 => '0', )