Wie entferne ich das Array-Element und indiziere das Array neu?


206

Ich habe einige Probleme mit einem Array. Ich habe ein Array, das ich wie unten ändern möchte. Ich möchte Elemente (Elemente) davon nach Index entfernen und dann das Array neu indizieren. Ist es möglich?

$foo = array(

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

);

$foo2 = array(

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

);

Antworten:


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

6
Genau das wollte ich posten, +1.
Michiel Pater

4
Dies ist besser als die Lösung von deceze, wenn mehrere Elemente gleichzeitig entfernt werden müssen - wenn die Indizes dieser Elemente zuvor erfasst wurden. Sobald Sie array_splice für das erste Element verwenden, verlieren Sie die Indizes der übrigen Elemente.
Jānis Elmeris

23
Es kann erwähnenswert sein, dass Sie mehrere Variablen / Array-Indizes in einem einzigen nicht unset($foo[0], $foo[3], $bar[1]);
gesetzten

sehr schöne Lösung Bruder :)
Michael Kisilenko

Ich habe das benutzt. Danke dir. Ich habe verwendet array_splice, und es hat nicht für den 0. und 1. Index funktioniert.
TheGreenCabbage


29

Du benutzt es besser array_shift(). Dadurch wird das erste Element des Arrays zurückgegeben, aus dem Array entfernt und das Array neu indiziert. Alles in einer effizienten Methode.


2
Dies ist in Ordnung, wenn Sie das erste Array-Element abrufen und dann entfernen möchten, wobei das Array neu indiziert wird. Die Gegenstückfunktion array_pop()ruft das letzte Array-Element ab und entfernt es, wenn Sie dies benötigen. Es kann jedoch keine Funktion ausgeführt werden, um auf ein Element in der Mitte des Arrays zu wirken.
Derrick Miller

1
Während dies orthogonal zusammenhängt, bezieht sich die Frage explizit auf jedes Element eines Arrays, nicht nur auf das erste.
Félix Gagnon-Grenier


9
Unset($array[0]); 

Sort($array); 

Ich weiß nicht, warum dies abgelehnt wird, aber wenn sich jemand die Mühe gemacht hat, es zu versuchen, werden Sie feststellen, dass es funktioniert. Durch die Verwendung von sort in einem Array werden die Schlüssel des Arrays neu zugewiesen. Der einzige Nachteil ist, dass die Werte sortiert werden. Da die Schlüssel offensichtlich auch mit neu zugewiesen werden, array_valuesspielt es keine Rolle, ob die Werte sortiert werden oder nicht.


9
Selbst wenn die Schlüssel neu zugewiesen werden, bleibt in der richtigen Antwort die ursprüngliche Reihenfolge erhalten.
s3v3n

1
"Ich möchte Elemente (Elemente) davon nach Index entfernen und dann das Array neu indizieren. Ist das möglich?" @ s3v3n Das OP hat nie darum gebeten, die ursprüngliche Reihenfolge beizubehalten. Ich habe einfach eine Lösung bereitgestellt, die funktioniert und das tut, was angegeben ist.
frostymarvelous

1
Die Frage ist 2 Jahre alt. Vergiss es!
s3v3n

@ s3v3n Es ist kein Groll. Ich möchte nur wissen warum. Offensichtlich in späteren Antworten zu verbessern. Ich stimme zu, dass es bessere Methoden gibt, aber gibt es einen Grund, warum diese Antwort so schlecht ist? Ist es Leistung? etc? Der gleiche Grund, warum ich auf SO bin, um zu lernen und zu lehren.
frostymarvelous

Unter normalen Umständen ist es sehr wahrscheinlich, dass der Programmierer diese Werte in genau derselben Reihenfolge benötigt wie die Eingabe. Nehmen wir als Beispiel einige Zeilen aus der Datenbank, die in einer Tabelle angezeigt werden sollen. oder eine Chat-Anwendung, bei der die Antworten in genau derselben Reihenfolge sein sollten. Die Anzahl der Beispiele kann unendlich sein. Der Punkt ist, dass in den meisten Fällen die Reihenfolge gleich sein muss oder zumindest der Programmierer die gleiche Reihenfolge der Elemente im Array erwarten würde.
s3v3n

4

Versuche es mit:

$foo2 = array_slice($foo, 1);

Dies funktioniert nur für das erste Element und nicht für ein beliebiges.
Felix Kling

0

Neben der Antwort von xzyfer

Die Funktion

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

Verwenden

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

custom_unset($my_array, 1);

Ergebnis

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.