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]

);
daGrevis
quelle

Antworten:

456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array
xzyfer
quelle
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
43
array_splice($array, 0, 1);

http://php.net/manual/en/function.array-splice.php

täuschen
quelle
2
Achten Sie darauf, dies nicht in einer Schleife zu verwenden, da dadurch die Array-Indizes der Schleife und des tatsächlichen Arrays nicht mehr synchron sind.
Mouagip
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.

Rene
quelle
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
10
array_splice($array, array_search(array_value, $array), 1);
user1092222
quelle
Dabei ist array_value 'was auch immer'
user1092222
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.

frostymarvelous
quelle
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);
hsz
quelle
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"
  }
RafaSashi
quelle