Después de array_filter(), ¿cómo puedo restablecer las claves para que vayan en orden numérico comenzando en 0?

StackOverflow https://stackoverflow.com/questions/3401850

  •  25-09-2019
  •  | 
  •  

Pregunta

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

¿Cómo puedo restablecer fácilmente los índices de la matriz para que comiencen en 0 y vayan en orden en la NUEVA matriz, en lugar de conservar los índices antiguos?

¿Fue útil?

Solución

Si llama array_values en la matriz, lo hará ser indizar de cero.

Otros consejos

Si está utilizando filtro de matriz de hacerlo de la siguiente manera

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

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

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 se encontraron con problemas sin saberlo 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 despojo. NULL elementos de una matriz y volver a indexar las claves.

Sin embargo, primero, es extremadamente importante que subraye la naturaleza codiciosa de array_filter() y cómo esto puede arruinar 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 si están en mayúsculas o minúsculas.

Pero mira lo que queda en la matriz cuando usamos valores_matriz() & filtro_matriz():

array_values(array_filter($array));

Matriz de salida ($matriz):

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() & es nulo() 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 obtienes tus claves reindexadas, todos los valores no nulos y ninguno de los valores nulos.Un resumen limpio, portátil y confiable para todas sus necesidades de filtrado nulo de matrices.Aquí hay un 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')));

Producción:

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

Finalmente, para cualquiera que prefiera la sintaxis de las construcciones del lenguaje, también puede simplemente insertar valores calificados en una nueva matriz para generar nuevos índices.

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

$result = [];
foreach ($array as $value) {
    if (strlen($value)) {
        $result[] = $value;
    }
}

var_export($result);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top