Rolf B: Warum muss ich einen CallbackFilterIterator rewind()-en bevor ich ihn nutzen kann?

Beitrag lesen

problematische Seite

Hallo alle,

ich wollte in PHP die eingebauten Iteratoren ausprobieren, z.B. den CallbackFilterIterator. Der bekommt dem Vernehmen nach einen Iterator als Parameter und einen Callback.

Der CallbackFilterIterator iteriert dann über den übergebenen Iterator, ruft pro erhaltenem Wert den Callback auf, und wenn der callback TRUE sagt, wird der Wert geyieldet.

Als Input habe ich mir einen einfachen Generator gebaut, der Zahlen eines Intervalls liefert, und wollte daraus die durch 3 teilbaren Zahlen herausfischen.

function Zahlenbereich($von, $bis)
{
   for ($i = $von; $i <= $bis; $i++)
      yield $i;
}

$zb_1_10 = Zahlenbereich(1,10);

$by3 = CallbackFilterIterator($zb_1_10, fn($z) => $z % 3 == 0);
foreach ($by3 as $z)
   echo "$z\n";

Doch, doch, das ist PHP. Das funktioniert soweit. Ich bekommt 3, 6 und 9.

Aber wenn ich $by3 manuell iterieren will, passiert nichts:

while ($by3->valid()) {
   echo $by3->current() . "\n";
   $by3->next();
}

Ich muss vor der Schleife $by3->rewind() aufrufen.

Das ist nicht der Fall, wenn ich mit dieser Schleife den einfachen Generator $zb_1_10 iterieren will. Ich habe die Doku so verstanden, dass foreach implizit einen rewind ausführt und deshalb kein Problem hat.

Wieso muss ich den CallbackFilterGenerator manuell rewinden? Das macht den Gebrauch ziemlich lästig. Es ist auch nicht intuitiv, vor allem, weil man Generatoren auch gar nicht rewinden kann. Ist das ein PHP Bug?

Rolf

--
sumpsi - posui - obstruxi

akzeptierte Antworten