Signatur
Beschreibung
MultipleIterator ist ein spezieller Iterator aus der SPL, der es erlaubt, mehrere Iterator-Objekte gleichzeitig zu durchlaufen. Bei jedem Schritt der foreach-Schleife werden alle angehängten Iteratoren gemeinsam vorgerückt, und die aktuellen Werte aller Iteratoren werden als Array zurückgegeben. Dies ist besonders nützlich, wenn man zwei oder mehr Datenquellen zeilenweise miteinander verknüpfen möchte, etwa beim paarweisen Verarbeiten von Arrays, Dateiströmen oder Datenbankresultaten.
Beim Hinzufügen von Iteratoren über attachIterator() kann optional ein Schlüssel (String oder Integer) vergeben werden, der als Array-Key für den jeweiligen Iterator-Wert im Ergebnis-Array verwendet wird. Wird kein Schlüssel angegeben, wird ein automatischer numerischer Index verwendet.
Das Verhalten, wenn Iteratoren unterschiedlich lang sind oder bereits erschöpft sind, lässt sich über Flags beim Konstruktor steuern. MultipleIterator::MIT_NEED_ALL (Standard) stoppt die Iteration sobald ein Iterator endet, MultipleIterator::MIT_NEED_ANY iteriert solange weiter, bis alle Iteratoren erschöpft sind.
Über die Flags kann außerdem gesteuert werden, ob die Schlüssel der Iteratoren aus dem Wert (MIT_KEYS_ASSOC) oder aus der numerischen Position (MIT_KEYS_NUMERIC) gebildet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $flags | int | MultipleIterator::MIT_NEED_ALL|MultipleIterator::MIT_KEYS_NUMERIC | Kombinierte Bit-Flags, die das Verhalten des Iterators steuern. Mögliche Werte: MultipleIterator::MIT_NEED_ALL, MultipleIterator::MIT_NEED_ANY, MultipleIterator::MIT_KEYS_NUMERIC, MultipleIterator::MIT_KEYS_ASSOC. |
Beispiele
Paralleles Iterieren über zwei Arrays
<?php
$names = new ArrayIterator(['Alice', 'Bob', 'Charlie']);
$scores = new ArrayIterator([95, 82, 77]);
$mi = new MultipleIterator(MultipleIterator::MIT_NEED_ALL | MultipleIterator::MIT_KEYS_ASSOC);
$mi->attachIterator($names, 'name');
$mi->attachIterator($scores, 'score');
foreach ($mi as $pair) {
echo $pair['name'] . ' hat ' . $pair['score'] . ' Punkte.\n';
}
MIT_NEED_ANY – Iteration bis alle Iteratoren erschöpft sind
<?php
$short = new ArrayIterator([1, 2]);
$long = new ArrayIterator(['a', 'b', 'c']);
$mi = new MultipleIterator(MultipleIterator::MIT_NEED_ANY | MultipleIterator::MIT_KEYS_NUMERIC);
$mi->attachIterator($short);
$mi->attachIterator($long);
foreach ($mi as $values) {
// Erschöpfte Iteratoren liefern null
var_dump($values);
}
Verwaltung der angehängten Iteratoren
<?php
$iter1 = new ArrayIterator(['x', 'y']);
$iter2 = new ArrayIterator([10, 20]);
$mi = new MultipleIterator();
$mi->attachIterator($iter1, 'letters');
$mi->attachIterator($iter2, 'numbers');
echo 'Anzahl angehängter Iteratoren: ' . $mi->countIterators() . "\n";
$mi->detachIterator($iter2);
echo 'Nach detach: ' . $mi->countIterators() . "\n";
// Wichtig · Fallstricke
Schlüssel-Kollisionen bei MIT_KEYS_ASSOC: Werden zwei Iteratoren mit demselben assoziativen Schlüssel angehängt, wirft MultipleIterator eine InvalidArgumentException. Schlüssel müssen eindeutig sein.
Erschöpfte Iteratoren mit MIT_NEED_ANY: Wenn ein Iterator erschöpft ist, liefert er null als Wert und null als Schlüssel – dies sollte im Code explizit behandelt werden, um unerwartetes Verhalten zu vermeiden.
Nur Iterator-Objekte: Es können ausschließlich Objekte angehängt werden, die das Iterator-Interface implementieren. Native PHP-Arrays müssen zuvor z. B. in ArrayIterator gewrappt werden.