On Sa, 2017-07-01 at 19:38 +0200, Andreas Hennings wrote:
> Hello internals,
> (this is my first email to this list, hopefully I'm doing ok.)
>
> -------------------------------------------------------------------
> -------------
>
> Background / motivation:
>
> Currently in PHP we have an interface "Iterator", and a final class
> "Generator"
> (and others) that implement it.
>
> Using an iterator in foreach () is straightforward:
> foreach ($iterator as $key => $value) {..}
>
> However, if we want to iterate only a portion and then continue
> elsewhere at the position where we stopped, we need to do something
> like this:
>
> for ($iterator->rewind(); $iterator->valid(); $iterator->next()) {
> $value = $iterator->current();
> [..]
> }
>
> This is unpleasantly verbose, and also adds performance overhead due
> to additional function calls.
Wouldn't SPL's NoRewindIterator be enough?
$nit = new NoRewindIterator($it);
foreach ($nit as $row) {
break;
}
foreach ($nit as $row) {
// continues same iteration
}
>
> Also, manually writing an iterator is quite painful.
>
> I sometimes implement "readers" that can be used like this (*):
>
> // Gets a reader at position zero.
> $reader = $readerProvider->getReader();
> while (FALSE !== $value = $reader->read()) {
> [..]
> }
>
> (*) Note that I am using FALSE as an equivalent for "end of data". Of
> course it would be nice if we had a dedicated constant for this, that
> does not constrain the range of possible values of the iterator.
That distinction is the reason why next() and valid() are different
methods in iterators.
johannes
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php