¿Cómo eliminar el elemento de matriz y luego volver a indexar la matriz?


206

Tengo algunos problemas con una matriz. Tengo una matriz que quiero modificar como a continuación. Quiero eliminar el elemento (elementos) de él por índice y luego volver a indexar la matriz. ¿Es posible?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);

Respuestas:


456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array

66
Esto es exactamente lo que quería publicar, +1.
Michiel Pater

44
Esto es mejor que la solución de deceze si es necesario eliminar varios elementos a la vez, si los índices de esos elementos se recopilan de antemano. Una vez que use array_splice en el primer elemento, pierde los índices de los elementos restantes.
Jānis Elmeris

23
Vale la pena señalar que puede desarmar múltiples variables / índices de matriz en una sola llamada desarmadaunset($foo[0], $foo[3], $bar[1]);
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

muy buena solución hermano :)
Michael Kisilenko

Yo usé esto Gracias. Estaba usando array_splice, y no funcionó para los índices 0º y 1º.
theGreenCabbage


29

Es mejor usarlo array_shift(). Eso devolverá el primer elemento de la matriz, lo eliminará de la matriz y volverá a indexar la matriz. Todo en un método eficiente.


2
Esto está bien cuando desea recuperar y luego eliminar el primer elemento de la matriz, reindexando la matriz en el proceso. Su función de contraparte array_pop()recuperará y eliminará el último elemento de matriz si lo necesita. Pero no se puede hacer que ninguna función actúe sobre un elemento en el medio de la matriz.
Derrick Miller

1
Si bien esto está relacionado ortogonalmente, la pregunta es explícitamente sobre cualquier elemento de una matriz, no solo el primero.
Félix Gagnon-Grenier


9
Unset($array[0]); 

Sort($array); 

No sé por qué se está rechazando esto, pero si alguien se ha molestado en probarlo, notará que funciona. Al usar sort en una matriz, se reasignan las teclas de la matriz. El único inconveniente es que ordena los valores. Como las claves obviamente se reasignarán, incluso con array_values, no importa si los valores se ordenan o no.


9
incluso si las teclas se reasignan, en la respuesta correcta, se mantendrá el orden inicial.
s3v3n

1
"Quiero eliminar el elemento (elementos) del mismo por índice y luego volver a indexar la matriz. ¿Es posible?" @ s3v3n El OP nunca solicitó mantener el orden inicial. Simplemente proporcioné una solución que funciona y hace lo que se indica.
frostymarvelous

1
La pregunta tiene 2 años. ¡Déjalo ir!
s3v3n

@ s3v3n No es un rencor. Solo deseo saber por qué. Obviamente para mejorar en respuestas posteriores. Estoy de acuerdo en que existen mejores métodos, pero ¿hay alguna razón por la que esta respuesta sea tan mala? ¿Es rendimiento? etc? La misma razón por la que estoy en SO, para aprender y enseñar.
frostymarvelous

En circunstancias normales, es muy probable que el programador necesite esos valores exactamente en el mismo orden que la entrada. Tomemos como ejemplo algunas filas de la base de datos que deberían mostrarse en una tabla; o una aplicación de chat donde las respuestas deben estar exactamente en el mismo orden. El número de ejemplos puede ser infinito, el punto es que en la mayoría de los casos el orden debe ser el mismo o al menos el programador esperaría el mismo orden de los elementos en la matriz.
s3v3n

4

Probar con:

$foo2 = array_slice($foo, 1);

Esto solo funciona para el primer elemento y no para uno arbitrario.
Felix Kling

0

Además de la respuesta de xzyfer

La función

function custom_unset(&$array=array(), $key=0) {
    if(isset($array[$key])){

        // remove item at index
        unset($array[$key]);

        // 'reindex' array
        $array = array_values($array);

        //alternatively
        //$array = array_merge($array); 

    }
    return $array;
}

Utilizar

$my_array=array(
    0=>'test0', 
    1=>'test1', 
    2=>'test2'
);

custom_unset($my_array, 1);

Resultado

 array(2) {
    [0]=>
    string(5) "test0"
    [1]=>
    string(5) "test2"
  }

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.