Start · Sprachen · PHP · Referenz · MultipleIterator

MultipleIterator

Klasse

Ermöglicht das parallele Iterieren über mehrere <code>Iterator</code>-Objekte gleichzeitig, sodass bei jedem Schritt alle Iteratoren synchron vorgerückt werden.

seit PHP 5.3.0 Kategorie: oop

Signatur

class MultipleIterator implements Iterator

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';
}
Alice hat 95 Punkte. Bob hat 82 Punkte. Charlie hat 77 Punkte.

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);
}
array(2) { [0]=> int(1) [1]=> string(1) "a" } array(2) { [0]=> int(2) [1]=> string(1) "b" } array(2) { [0]=> NULL [1]=> string(1) "c" }

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";
Anzahl angehängter Iteratoren: 2 Nach detach: 1

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