©Sergey Emelyanov 2025 | Alle Rechte vorbehalten
Wer schon länger mit PHP arbeitet, kennt das Gefühl: Man stößt auf eine scheinbar banale Aufgabe – „Gib mir doch bitte schnell das erste Element des Arrays“ – und merkt plötzlich, dass man dafür gleich eine Hand voll Tricks auspacken muss. Genau diese Alltagspause will PHP 8.5 nun beseitigen. Im April-/Mai-Trubel hat das RFC die beiden neuen Helferlein array_first() und array_last() abgenickt. Zeit, kurz zurückzuschauen, warum das überhaupt nötig war.
array_first([1, 2, 3]); // 1
array_last(['a' => 2, 'b' => 1]); // 1
array_first([]); // null
array_last([2, 3, null]); // null
Kein Kopfstand mehr, keine Seiteneffekte, einfach — gib das vorderste oder hinterste Element, fertig.
Am Mythos „PHP kann doch alles mit Arrays“ ist ja was dran. Bloß: Arrays in PHP sind eben nicht nur Listen, sondern gleichzeitig Hash-Maps, Sets, was auch immer. Erste und letzte Einträge sind dadurch gar nicht mal so eindeutig. Schau dir dieses Beispiel an:
$array = [
"g" => 456,
2,
4 => "string"
];
var_dump($array[0]); // 2 – nicht 456
Der numerische Schlüssel beginnt erst bei 1? 0? Der Hash-Key „g“? Alles liegt bunt durcheinander.
2018 (PHP 7.3) kamen array_key_first() und array_key_last() ins Haus. Wer damit lebt, hat seitdem geschrieben:
$first = $array[array_key_first($array)];
$last = $array[array_key_last($array)];
Aber warum nicht gleich value-Funktionen? Im damaligen RFC waren sie sogar vorgeschlagen – array_value_first(), array_value_last() –, nur bekamen sie nicht genug Stimmen. Vielleicht war es Müdigkeit, vielleicht dachten manche, reset() und end() seien „gut genug“.
Die Veteranen unter uns greifen seit PHP 4 auf reset() und end() zurück:
reset($array); // liefert 456, setzt internen Pointer auf Anfang
end($array); // "string", setzt Pointer ans Ende
Funktioniert, ja. Nur eben mit Nebenwirkungen: Der interne Pointer wandert. In einer Schleife oder in mehrfach verschachtelten Funktionen ist das brandgefährlich. Auch array_shift() und array_pop() tun ihren Dienst, fressen dabei aber das jeweilige Element aus dem Array heraus – eine Operation, die man im reinen Lesekontext eher ungern macht.
Mit array_first() / array_last() kommt das Beste aus zwei Welten: kein Pointer-Gefummel, keine schleichenden Änderungen, kein zweimaliger Zugriff (Schlüssel holen, Wert nachschlagen). PHP internal holt einfach das passende Bucket und gibt den Content zurück. Leer? Dann eben null – klarer kann eine API kaum sein.
Wer Benchmarks mag, wird feststellen, dass array_first() ungefähr auf Augenhöhe mit reset() liegt, aber ohne dessen Pointer-Kosten. Bei großen Hash-Arrays ist der Weg sogar kürzer, weil kein Durchmarsch bis Ende nötig ist, um end() zu emulieren. Natürlich reden wir hier über Mikrosekunden, doch im heißen Path (z. B. JSON-Serialisierung großer Datenmengen) summiert sich das schnell.
Stell dir vor, du bekommst von einer API eine Response wie:
$response = [
'meta' => [...],
'data' => [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
// ...
],
];
$firstUser = array_first($response['data']);
$lastUser = array_last($response['data']);
Sauber, lesbar, ohne doppelten Boden. Oder im Logging: Du willst nur die letzte Meldung eines Tages aus einem Array aller Einträge ziehen – ein Funktionsaufruf genügt.
War das dringend nötig? Vielleicht hätte man auch weiterhin „nach alter Väter Sitte“ reset(), end() oder die key-Tricks verwenden können. Doch gute Sprachevolution bedeutet, unangenehme Stolpersteine aus dem Alltag zu räumen, und genau das passiert hier. Schließlich sollen Entwickler ihre Gehirnkapazität nicht darauf verschwenden, interne Pointer-Spezialitäten oder Schlüssel‐Akrobatik zu memorieren, sondern auf das Eigentliche: die Logik ihrer Anwendung.
Ich für meinen Teil sage: Willkommen, array_first() und array_last() – ihr hättet ruhig schon früher vorbeikommen dürfen.
©Sergey Emelyanov 2025 | Alle Rechte vorbehalten