Come rimuovere l'elemento dell'array e quindi reindicizzare l'array?


206

Ho dei problemi con un array. Ho un array che voglio modificare come di seguito. Voglio rimuovere l'elemento (elementi) di esso per indice e quindi reindicizzare l'array. È possibile?

$foo = array(

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

);

$foo2 = array(

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

);

Risposte:


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

6
Questo è esattamente quello che volevo pubblicare, +1.
Michiel Pater,

4
È meglio che ingannare la soluzione se è necessario rimuovere più articoli contemporaneamente - se gli indici di tali articoli vengono raccolti in anticipo. Una volta che usi array_splice sul primo oggetto, perdi gli indici degli altri oggetti.
Jānis Elmeris,

23
Vale la pena notare che è possibile unset($foo[0], $foo[3], $bar[1]);
annullare l'inserimento di

molto bella soluzione fratello :)
Michael Kisilenko il

Ho usato questo Grazie. Stavo usando array_splicee non ha funzionato per gli indici 0 ° e 1 °.
theGreenCabbage il


29

È meglio che usi array_shift(). Ciò restituirà il primo elemento dell'array, lo rimuoverà dall'array e indicizzerà nuovamente l'array. Tutto in un unico metodo efficiente.


2
Questo va bene quando si desidera recuperare e quindi rimuovere il primo elemento dell'array, reindicizzando l'array nel processo. La sua funzione di controparte array_pop()recupererà e rimuoverà l'ultimo elemento dell'array, se necessario. Tuttavia, nessuna funzione può essere fatta per agire su un elemento nel mezzo dell'array.
Derrick Miller,

1
Mentre questo è ortogonalmente correlato, la domanda riguarda esplicitamente qualsiasi elemento di un array, non solo il primo.
Félix Gagnon-Grenier,


9
Unset($array[0]); 

Sort($array); 

Non so perché questo sia stato sottoposto a downgrade, ma se qualcuno si è preso la briga di provarlo, noterai che funziona. L'utilizzo dell'ordinamento su un array riassegna le chiavi dell'array. L'unico inconveniente è che ordina i valori. Poiché le chiavi saranno ovviamente riassegnate, anche con array_values, non importa se i valori vengono ordinati o meno.


9
anche se le chiavi verranno riassegnate, nella risposta corretta, l'ordine iniziale verrà mantenuto.
s3v3n,

1
"Voglio rimuovere l'elemento (elementi) di esso per indice e quindi reindicizzare l'array. È possibile?" @ s3v3n L'OP non ha mai chiesto di mantenere l'ordine iniziale. Ho semplicemente fornito una soluzione che funziona e fa ciò che viene dichiarato.
gelido

1
La domanda ha 2 anni. Lasciarlo andare!
s3v3n,

@ s3v3n Non è un rancore. Vorrei solo sapere perché. Ovviamente per migliorare nelle risposte successive. Sono d'accordo che ci sono metodi migliori, ma c'è una ragione per cui questa risposta è così negativa? Sono prestazioni? eccetera? Stesso motivo per cui sono su SO, per imparare e insegnare.
gelido

In circostanze normali, è molto probabile che il programmatore abbia bisogno di quei valori esattamente nello stesso ordine dell'input. Prendiamo ad esempio alcune righe del database che dovrebbero essere visualizzate in una tabella; o un'applicazione di chat in cui le risposte dovrebbero essere esattamente nello stesso ordine. Il numero di esempi può essere infinito, il punto è che nella maggior parte dei casi l'ordine deve essere uguale o almeno il programmatore si aspetterebbe lo stesso ordine degli elementi nell'array.
s3v3n,

4

Prova con:

$foo2 = array_slice($foo, 1);

Funziona solo per il primo elemento e non per uno arbitrario.
Felix Kling

0

Oltre alla risposta di xzyfer

La funzione

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;
}

Uso

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

custom_unset($my_array, 1);

Risultato

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.