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

Reply via email to