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