Die Arbeit mit Arrays gehört zum Alltag in PHP. Häufig muss das erste Element eines Arrays entfernt und gleichzeitig zurückgegeben werden. Genau dafür stellt PHP die Funktion array_shift() bereit. In diesem Tutorial wird gezeigt, wie die Funktion arbeitet, welche Auswirkungen sie auf die Keys hat und wann bessere Alternativen existieren.

Bevor die Funktion in Beispielen zum Einsatz kommt, werden zunächst die Syntax und das Verhalten bei numerischen sowie assoziativen Arrays erläutert.
Syntax und Rückgabewert
Bevor die Funktion in der Praxis eingesetzt wird, lohnt sich ein Blick auf die Syntax und das Verhalten des Rückgabewerts.
Die Funktion erwartet ein Array als Referenz und gibt das entfernte erste Element zurück. Ist das Array leer, liefert array_shift() den Wert null. Wichtig: Das übergebene Array wird direkt verändert, es wird keine Kopie erstellt. Alle numerischen Schlüssel werden nach dem Entfernen neu indiziert, während String-Keys erhalten bleiben.
Grundlegendes Beispiel
Ein einfaches Beispiel zeigt die Funktionsweise von array_shift() am deutlichsten.
<?php
$farben = ['Rot', 'Gruen', 'Blau', 'Gelb'];
$erstes = array_shift($farben);
echo $erstes; /* Rot */
print_r($farben);
/* Array ( [0] => Gruen [1] => Blau [2] => Gelb ) */
Das erste Element Rot wird aus dem Array entfernt und in der Variablen $erstes gespeichert. Das verbleibende Array enthält nur noch drei Elemente mit neu vergebenen numerischen Keys.
array_shift bei assoziativen Arrays
Die Funktion funktioniert auch mit assoziativen Arrays, verhält sich dabei aber leicht anders als bei numerisch indizierten Arrays.
<?php
$person = ['name' => 'Max', 'alter' => 28, 'stadt' => 'Berlin'];
$erstes = array_shift($person);
echo $erstes; /* Max */
print_r($person);
/* Array ( [alter] => 28 [stadt] => Berlin ) */
Bei assoziativen Arrays bleiben die String-Keys unverändert. Es wird lediglich das erste Schlüssel-Wert-Paar entfernt, ohne dass die restlichen Keys angepasst werden.
Numerische Keys werden neu indiziert
Ein häufiger Stolperstein ist die automatische Neu-Indizierung der numerischen Schlüssel. Nach dem Aufruf von array_shift() beginnen die numerischen Keys wieder bei 0. Wer sich auf bestimmte Index-Positionen verlässt, sollte dieses Verhalten unbedingt berücksichtigen. String-Keys sind davon nicht betroffen und behalten ihre ursprünglichen Bezeichnungen.
array_shift vs. array_pop
Während array_shift() das erste Element entfernt, arbeitet array_pop() am anderen Ende des Arrays. Beide Funktionen geben das entfernte Element zurück.
<?php
$zahlen = [10, 20, 30, 40];
$vorne = array_shift($zahlen);
echo $vorne; /* 10 - erstes Element */
$hinten = array_pop($zahlen);
echo $hinten; /* 40 - letztes Element */
Das folgende Diagramm veranschaulicht den Unterschied beider Funktionen.
flowchart LR
A[A, B, C, D] -->|shift| B[A]
A -->|shift| C[B, C, D]
D[A, B, C, D] -->|pop| E[D]
D -->|pop| F[A, B, C]
Ein typischer Anwendungsfall für array_shift() ist die Verarbeitung einer Warteschlange nach dem FIFO-Prinzip (First In, First Out).
<?php
$warteschlange = ['Auftrag A', 'Auftrag B', 'Auftrag C'];
while (!empty($warteschlange)) {
$aktuell = array_shift($warteschlange);
echo "Verarbeite: $aktuell";
}
Elemente werden in der Reihenfolge abgearbeitet, in der sie hinzugefügt wurden. Neue Einträge lassen sich mit array_push() am Ende anfügen.
array_shift vs. unset
Mit unset() kann ebenfalls ein Element an einer bestimmten Position entfernt werden. Der entscheidende Unterschied: unset() gibt keinen Rückgabewert zurück und indiziert die numerischen Keys nicht neu. Nach einem unset($array[0]) bleibt eine Lücke im Index bestehen. Bei array_shift() hingegen wird das Array automatisch neu durchnummeriert. Für das gezielte Entfernen eines Elements an einer beliebigen Position ist unset() in Kombination mit array_values() eine gängige Alternative.
Performance bei großen Arrays
Die Funktion array_shift() hat eine Zeitkomplexität von O(n), da nach dem Entfernen alle verbleibenden numerischen Keys neu berechnet werden müssen. Bei kleinen Arrays ist das kein Problem. Bei Arrays mit tausenden oder mehr Einträgen kann dieser Vorgang jedoch spürbar langsamer werden. In solchen Fällen ist array_pop() mit O(1) die deutlich schnellere Wahl, da am Ende des Arrays keine Neu-Indizierung nötig ist. Alternativ kann array_reverse() in Kombination mit array_pop() eingesetzt werden, wenn die Reihenfolge beibehalten werden muss.
Fazit
Die Funktion array_shift() ist das passende Werkzeug, um das erste Element eines Arrays zu entfernen und gleichzeitig darauf zuzugreifen. Sie eignet sich besonders für die Queue-Verarbeitung nach dem FIFO-Prinzip. Wichtig ist das Wissen um die Neu-Indizierung numerischer Keys und die O(n) Komplexität bei großen Arrays. Für das Entfernen am Ende bietet sich array_pop() an, für das Einfügen am Anfang steht array_unshift() als Gegenstück bereit.