Signatur
Beschreibung
InfiniteIterator ist eine eingebaute SPL-Klasse, die einen bestehenden Iterator in eine Endlosschleife verwandelt. Sobald der innere Iterator sein letztes Element durchlaufen hat, ruft InfiniteIterator automatisch rewind() auf und beginnt von vorne – ohne dass der Aufrufer manuell eingreifen muss.
Typische Einsatzgebiete sind Round-Robin-Verfahren (z. B. Lastverteilung auf Server), zyklische Farbpaletten, Menü-Hervorhebungen oder andere Situationen, in denen eine endliche Liste wiederholt durchlaufen werden soll. In Kombination mit einem LimitIterator lässt sich die Anzahl der gewünschten Iterationen präzise begrenzen.
Da die Klasse von IteratorIterator erbt, implementiert sie automatisch Iterator, OuterIterator und Traversable. Der einzig notwendige Schritt ist die Übergabe eines gültigen Iterator-Objekts im Konstruktor.
Achtung: Ein InfiniteIterator ohne äußere Abbruchbedingung (z. B. break, LimitIterator oder Zähler) läuft für immer und erzeugt eine Endlosschleife.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $iterator Pflicht | Iterator | Der zu umhüllende Iterator, der zyklisch wiederholt werden soll. Er muss die Iterator-Schnittstelle implementieren. |
Rückgabewert
Beispiele
Einfache Endlosschleife mit Abbruch per Zähler
<?php
$data = new ArrayIterator(['Rot', 'Grün', 'Blau']);
$infinite = new InfiniteIterator($data);
$count = 0;
foreach ($infinite as $farbe) {
echo $farbe . PHP_EOL;
if (++$count >= 7) {
break;
}
}
Round-Robin-Lastverteilung mit LimitIterator
<?php
$server = new ArrayIterator(['server1', 'server2', 'server3']);
$roundRobin = new InfiniteIterator($server);
// Verteile 8 Anfragen reihum auf die Server
$requests = new LimitIterator($roundRobin, 0, 8);
foreach ($requests as $i => $srv) {
echo "Anfrage " . ($i + 1) . " → " . $srv . PHP_EOL;
}
Zyklische CSS-Klassen für Tabellenzeilen
<?php
$klassen = new ArrayIterator(['row-light', 'row-dark']);
$zyklus = new InfiniteIterator($klassen);
$eintraege = ['Alice', 'Bob', 'Carol', 'Dave', 'Eve'];
echo '<table>' . PHP_EOL;
foreach ($eintraege as $name) {
$klasse = $zyklus->current();
$zyklus->next();
echo " <tr class=\"$klasse\"><td>$name</td></tr>" . PHP_EOL;
}
echo '</table>' . PHP_EOL;
// Wichtig · Fallstricke
Endlosschleife: Ohne eine explizite Abbruchbedingung (break, Zähler oder LimitIterator) läuft foreach über einen InfiniteIterator niemals zu Ende und führt zu einem Speicherüberlauf oder einem Timeout-Fehler.
Leere Iteratoren: Wird ein leerer Iterator (kein einziges Element) übergeben, so kann rewind() keinen gültigen Zustand herstellen. In diesem Fall terminiert foreach sofort, ohne die Schleife auch nur einmal auszuführen.
Schlüssel: Die Schlüssel werden beim Neustart des Iterators ebenfalls zurückgesetzt. Wenn innerhalb der Schleife auf den Schlüssel ($key in foreach ($it as $key => $value)) zugegriffen wird, beginnt er nach jedem Zyklus wieder bei 0.