2010-04-16 620 views
30

si filtro una matriz con array_filter para eliminar los valores nulos, las claves se conservan y esto genera "agujeros" en la matriz. Por ejemplo:php array_filter sin preservación de clave

The filtered version of 
    [0] => 'foo' 
    [1] => null 
    [2] => 'bar' 
is 
    [0] => 'foo' 
    [2] => 'bar' 

¿Cómo puedo obtener, en lugar

[0] => 'foo' 
[1] => 'bar' 

? Gracias

Respuesta

0

El uso de esta entrada:

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

Hay algunas maneras que usted podría hacerlo. Demo

Es un poco fuera de tema para que aparezca comportamiento predeterminado codiciosos array_filter 's, pero si usted está buscando en Google a esta página, esta es probablemente importante información relevante para su proyecto/tarea:

var_export(array_values(array_filter($array))); // NOT GOOD!!!!! 

Problemas en la salida :

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

ya por los caminos que van a trabajar:

Método # 1: (array_values(), array_filter() w/!is_null())

var_export(array_values(array_filter($array,function($v){return !is_null($v);}))); // good 

Método # 2: (foreach(), array-auto indexado, !==null) Método

foreach($array as $v){ 
    if($v!==null){$result[]=$v;} 
} 
var_export($result); // good 

# 3: (array_walk(), matriz de índice automático, !is_null())

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

Los tres métodos proporcionan la siguiente salida "libre de null":

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