Start · Sprachen · PHP · Referenz · InfiniteIterator

InfiniteIterator

Klasse

Erlaubt es, unendlich über einen <code>Iterator</code> zu iterieren, indem er am Ende automatisch zurückgesetzt wird.

seit PHP 5.1.0 Kategorie: oop

Signatur

class InfiniteIterator extends IteratorIterator

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

Typ

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;
    }
}
Rot Grün Blau Rot Grün Blau Rot

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;
}
Anfrage 1 → server1 Anfrage 2 → server2 Anfrage 3 → server3 Anfrage 4 → server1 Anfrage 5 → server2 Anfrage 6 → server3 Anfrage 7 → server1 Anfrage 8 → server2

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;
<table> <tr class="row-light"><td>Alice</td></tr> <tr class="row-dark"><td>Bob</td></tr> <tr class="row-light"><td>Carol</td></tr> <tr class="row-dark"><td>Dave</td></tr> <tr class="row-light"><td>Eve</td></tr> </table>

// 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.