In PHP laufen Iterator in foreach-Schleifen etwas anders ab als in Java. Dies liegt an der Methode valid(), welche im Gegensatz zum Java-Äquivalent hasNext() nicht vor dem Sprung zum nächsten Element, sondern erst danach ausgeführt wird. In eine While-Schleife umgewandelt, sieht die Verarbeitung eines Iterators innerhalb von foreach-Konstrukten folgendermaßen aus:

<?php
$it->rewind();
while ($it->valid()) {
  $it->current();
  $it->next();
}

rewind() setzt zuerst den Iterator an die erste Stelle zurück, valid() prüft anschließend für jede Position, ob es sich hierbei noch um ein gültiges Element handelt. Dann gibt man bereits mit current() das aktuelle Element aus und springt anschließend am Ende der Schleife mit next() zum nächsten Element. Sollte next() nun über den Iterator „hinaus“ springen, wird valid() beim nächsten Aufruf false zurückgeben und die Schleife nicht mehr ausgeführt.

Wichtig zu beachten ist hierbei die Reihenfolge der Verarbeitung von current() und next(), welche bei der Implementierung von hasNext() in Java umgekehrt stattfinden würde.

I do not maintain a comments section. If you have any questions or comments regarding my posts, please do not hesitate to send me an e-mail to blog@stefan-koch.name.