2010-08-04 13 views
52

Acabo de utilizar array_filter para eliminar las entradas que tenían solo 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 olvidé de lo obvio, pero mi pregunta es ...Después de array_filter(), ¿cómo puedo restablecer las teclas para ir en orden numérico comenzando en 0

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

+0

posible duplicado de [array php \ _filter sin preservación clave] (http://stackoverflow.com/questions/2653017/php-array-filter- sin-key-preservation) –

+0

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

Respuesta

126

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

+5

Tan molesto que tengo que esperar para aprobar su respuesta. – jel402

5

Uso 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 
12

Si está utilizando el filtro de matriz siga el siguiente procedimiento

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

Oh, el tiempo que he perdido tratando de descubrir por qué el resultado de json_encode una matriz es diferente al de json_encode una matriz array_filtered ... muchas gracias ... – Jerther

3

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', 
) 
Cuestiones relacionadas