On 12/20/2012 04:05 PM, David Muir wrote:

The curiosity (bug?) is the need to call rewind():

$replacements_iterator = new InfiniteIterator(new ArrayIterator($replacements));
$replacements_iterator->rewind();  // why is the rewind needed?

$result = preg_replace_callback(
    '/word/',
    function($matches) use ($replacements_iterator) {
        $r = $replacements_iterator->current();
        $replacements_iterator->next();
        return $r;
    },
    'word word word word word word word word'
);

In other (simple) scripts using InfiniteIterator the rewind wasn't needed.




What happens if you do:
$replacements_iterator = new InfiniteIterator(new ArrayIterator($replacements));
var_dump($replacements_iterator->current());

If I remember correctly, when you pass a traversable into foreach, under the 
hood, it basically calls:

$iterator->rewind();
while($iterator->valid()){
     $value = $iterator->current();
     ....(foreach block)....
     $iterator->next();
}

So that might explain why it works in "(simple) scripts".

It does seem like a bug that the rewind is required though. A newly created 
iterator should already be in a rewound state so the call shouldn't be needed.

Cheers,
David

I logged a bug so this can be tracked and re-discovered: 
https://bugs.php.net/bug.php?id=63823

Chris
--
christopher.jo...@oracle.com  http://twitter.com/ghrd
Newly updated, free PHP & Oracle book:
http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to