Me preocupa cuántos programadores han copiado / pegado inocentemente el array_values(array_filter())
método en sus códigos ; me pregunto cuántos programadores sin saberlo se encontraron con problemas debido a la codicia de array_filter. O peor aún, cuántas personas nunca descubrieron que la función elimina demasiados valores de la matriz ...
Presentaré una mejor alternativa para el proceso de dos partes de quitar NULL
elementos de una matriz y volver a indexar las claves.
Sin embargo, primero, es extremadamente importante que array_filter()
haga hincapié en la naturaleza codiciosa y cómo esto puede destrozar 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 mire lo que queda en la matriz cuando usamos array_values () & array_filter () :
array_values(array_filter($array));
Matriz de salida ($ matriz):
array (
0 => 'foo',
1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!
Ahora mire lo que obtiene 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 reindexadas, todos los valores no nulos y ninguno de los valores nulos. Una sola línea limpia, portátil y confiable para todas sus necesidades de filtrado nulo de arreglos. He aquí una demostración .
De manera similar, si desea eliminar elementos vacíos, falsos y nulos (conservando 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',
)
Finalmente, para cualquiera que prefiera la sintaxis de construcciones de lenguaje, también puede simplemente insertar valores de calificación en una nueva matriz para emitir nuevos índices.
$array=['foo', NULL, 'bar', 0, false, null, '0', ''];
$result = [];
foreach ($array as $value) {
if (strlen($value)) {
$result[] = $value;
}
}
var_export($result);