next()
Erfahren Sie, wie PHP's next() den internen Zeiger eines Arrays vorwärts bewegt, das nächste Element oder false am Ende zurückgibt und mit reset(), current() und prev() zusammenarbeitet.
Einführung
Jedes PHP-Array besitzt einen internen Zeiger, der ein Element als „aktuell" markiert. Eine kleine Gruppe von Funktionen bewegt diesen Zeiger, ohne dass Sie selbst eine Schleife schreiben müssen: reset(), current(), prev(), end() und next(). Dieser Artikel konzentriert sich auf next() — was die Funktion zurückgibt, wie sie den Zeiger verändert und welche Fallstricke es zu beachten gilt.
Was die Funktion next() tut
next() rückt den internen Zeiger des Arrays um eine Position vor und gibt den Wert des Elements zurück, auf dem er landet. Die Signatur lautet:
next(array &$array): mixedAus dieser Signatur ergeben sich einige Punkte:
- Das Array wird als Referenz übergeben (
&$array).next()gibt kein neues Array zurück — es verändert den Zeiger des übergebenen Arrays direkt. - Es gibt den Wert des nächsten Elements zurück, nicht des aktuellen. Wenn Sie das Element unter dem Zeiger lesen möchten, ohne ihn zu bewegen, verwenden Sie
current(). - Am Ende des Arrays gibt es
falsezurück und lässt den Zeiger hinter dem letzten Element stehen. Erneutes Aufrufen vonnext()gibt weiterhinfalsezurück.
Beim Start eines Skripts liegt der Zeiger auf dem ersten Element, sodass das allererste next() bereits das zweite Element zurückgibt — nicht das erste. Das ist die häufigste Quelle von „Off-by-one"-Verwechslungen bei next().
Einfaches Beispiel
<?php
$fruits = ['apple', 'banana', 'cherry'];
echo current($fruits) . "\n"; // pointer starts on the first element
echo next($fruits) . "\n"; // move forward, return the second
echo next($fruits) . "\n"; // move forward, return the third
var_dump(next($fruits)); // past the end -> falseDie Ausgabe lautet:
apple
banana
cherry
bool(false)current() liest das erste Element, ohne den Zeiger zu bewegen; anschließend rückt jedes next() um ein Element vor. Der letzte Aufruf geht über das Ende des Arrays hinaus und gibt false zurück.
Ein Array mit next() durchlaufen
Ein gängiges Muster ist, mit reset() zu beginnen (um sicherzustellen, dass der Zeiger am Anfang steht) und dann mit next() zu iterieren, bis false zurückgegeben wird:
<?php
$colors = ['red', 'green', 'blue'];
reset($colors);
echo current($colors) . "\n"; // first element
while (($color = next($colors)) !== false) {
echo $color . "\n";
}Ausgabe:
red
green
blueBeachten Sie den !== false-Vergleich (strenger Vergleich). Das ist wichtig — siehe den nächsten Abschnitt.
Der „Falsy-Wert"-Fallstrick
next() gibt false am Ende des Arrays zurück, aber es gibt auch false zurück, wenn der tatsächliche Wert eines Elements false, 0, "" oder null ist. Eine lockere Prüfung wie while (next($array)) hört vorzeitig auf, sobald sie auf einen dieser Werte trifft:
<?php
$data = ['a', 0, 'b'];
reset($data);
// WRONG: stops at the 0, never reaches 'b'
while ($value = next($data)) {
echo $value . "\n";
}
echo "---\n";Das gibt nur aus:
---Die Schleife endet sofort, weil next() den Wert 0 (das zweite Element) zurückgibt, der als falsy gilt. Bei Arrays, die falsy-Werte enthalten können, empfiehlt sich stattdessen foreach, das den internen Zeiger vollständig umgeht, oder die Verwendung von key(), um das tatsächliche Ende zu erkennen:
<?php
$data = ['a', 0, 'b'];
reset($data);
do {
echo current($data) . "\n";
} while (next($data) !== null && key($data) !== null);In der Praxis ist ein einfaches foreach das richtige Werkzeug zum Durchlaufen aller Elemente; greifen Sie auf next() nur zurück, wenn Sie wirklich eine manuelle, schrittweise Kontrolle des Zeigers benötigen.
next() und die verwandten Zeigerfunktionen
| Funktion | Bewegt den Zeiger? | Gibt zurück |
|---|---|---|
current() | Nein | Element unter dem Zeiger |
next() | Ein Schritt vorwärts | Neues aktuelles Element (oder false am Ende) |
prev() | Ein Schritt zurück | Neues aktuelles Element (oder false vor dem Anfang) |
reset() | Zum ersten Element | Erstes Element |
end() | Zum letzten Element | Letztes Element |
key() | Nein | Schlüssel des aktuellen Elements (oder null hinter dem Ende) |
Die Kombination von next() und prev() ermöglicht es, während eines einzelnen Durchlaufs voraus zu schauen und zurückzugehen.
Fazit
Die Funktion next() rückt den internen Zeiger eines Arrays um einen Schritt vor und gibt den Wert zurück, auf dem er landet, oder false, sobald er das Ende überschreitet. Da sie auf dem internen Zeiger basiert und das Ende mit false signalisiert, arbeitet sie natürlich mit reset(), current() und prev() zusammen — achten Sie jedoch auf Arrays mit falsy-Werten, bei denen eine lose Schleifenbedingung zu früh abbricht. Für unkomplizierte Iteration bevorzugen Sie foreach; verwenden Sie next(), wenn Sie explizite Kontrolle über die Position des Zeigers benötigen.