Me preocupa el número de programadores han copiar inocentemente/pegar el método array_values(array_filter())
en sus códigos - Me pregunto cuántos programadores involuntariamente se encontraron con problemas debido a la avaricia de array_filter. O peor, cuántas personas nunca descubrieron que la función purga demasiados valores de la matriz ...
Voy a presentar una mejor alternativa para el proceso de dos partes de pelar NULL
elementos de una matriz y volver a indexar las claves .
Sin embargo, en primer lugar, es extremadamente importante que insista en la naturaleza codiciosa de array_filter()
y cómo esto puede silenciosamente modelar su proyecto. Aquí es una matriz con valores mixtos en lo que se exponga el problema:
$array=['foo',NULL,'bar',0,false,null,'0',''];
valores nulos serán eliminados independientemente de mayúsculas/minúsculas.
Pero mira lo que queda en la matriz cuando usamos array_values() & 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 se obtiene con mi método que utiliza 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/explicando:
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 de obtener su re- claves 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 un demonstration.
mismo modo, si desea eliminar los elementos vacíos, falsos, y nulos (ceros de retención), 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')));
de salida:
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => '0',
)
posible duplicado de [array php \ _filter sin preservación clave] (http://stackoverflow.com/questions/2653017/php-array-filter- sin-key-preservation) –
A menos que esté absolutamente seguro de que no tiene valores vacíos/cero-ish/falsey en su matriz, debo instarle a no usar 'array_filter()' - puede purgar más de lo que tener la intención de. Aquí hay alguna explicación con una demostración: http://stackoverflow.com/a/43657056/2943403 – mickmackusa