keys filtrar example con array_walk array_filter array php arrays filter reindex

filtrar - php array_filter keys



Después de array_filter(), ¿cómo puedo restablecer las teclas para ir en orden numérico comenzando en 0? (4)

Si llama a array_values en su matriz, se reindexará desde cero.

Solo utilicé array_filter para eliminar entradas que solo tenían el valor '''' de una matriz, y ahora quiero aplicar ciertas transformaciones en ella dependiendo del marcador de posición empezando desde 0, pero desafortunadamente aún conserva el índice original. Miré por un momento y no pude ver nada, tal vez me perdí lo obvio, pero mi pregunta es ...

¿Cómo puedo restablecer fácilmente los índices de la matriz para comenzar en 0 y ponerlos en orden en la NUEVA matriz, en lugar de retener índices antiguos?


Use array_values() :

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


Si está utilizando el filtro de matriz, hágalo de la siguiente manera

$NewArray = array_values(array_filter($OldArray));


Me preocupa cuántos programadores inocentemente han copiado / pegado el array_values(array_filter()) en sus códigos . Me pregunto cuántos programadores sin darse cuenta se encontraron con problemas debido a la codicia de array_filter. O peor, cuántas personas nunca descubrieron que la función purga demasiados valores de la matriz ...

Presentaré una mejor alternativa para el proceso de dos partes de NULL elementos NULL de una matriz y volver a indexar las claves.

Sin embargo, primero, es extremadamente importante que array_filter() hincapié en la naturaleza codiciosa de array_filter() y cómo esto puede modificar silenciosamente su proyecto. Aquí hay una matriz con valores mixtos que expondrá el problema:

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

Los valores nulos se eliminarán independientemente de mayúsculas / minúsculas.

Pero mira lo que queda en la matriz cuando usamos array_values ​​() y array_filter () :

array_values(array_filter($array));

Matriz de salida ($ array):

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

Ahora mira lo que obtienes con mi método que usa array_walk () & is_null () para generar una nueva matriz filtrada:

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

Esto se puede escribir en varias líneas para facilitar la lectura / explicación:

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 salida ($ filtro):

array ( 0 => ''foo'', 1 => ''bar'', 2 => 0, 3 => false, 4 => ''0'', 5 => '''', )

Con mi método, obtiene sus claves re-indexadas, todos los valores no nulos y ninguno de los valores nulos. Un único trazador limpio, portátil y confiable para todas sus necesidades de filtrado nulo. Aquí hay una demostración .

Del mismo modo, si desea eliminar los elementos vacíos, falsos y nulos (retención de ceros), estos cuatro métodos funcionarán:

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'')));

Salida:

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