Re: Extension for str_replace / preg_replace with arrays

From: Date: Thu, 20 Dec 2012 23:34:07 +0000
Subject: Re: Extension for str_replace / preg_replace with arrays
References: 1 2 3 4 5 6 7  Groups: php.internals 
Request: Send a blank email to internals+get-64393@lists.php.net to get a copy of this message
On 12/20/2012 08:31 AM, Larry Garfield wrote:
On 12/19/12 10:30 PM, Christopher Jones wrote:
On 12/19/2012 03:18 PM, Larry Garfield wrote:
You could likely simplify the code even further using an infinite iterator: http://us1.php.net/infiniteiterator $result = preg_replace_callback(
     '/word/',
     function($matches) use (&$replacements_iterator) {
         return $replacements->next();
     },
     'word word word word word'
); --Larry Garfield
What am I missing that causes the first call to $replacements_iterator->current() to return NULL unless the iterator is rewound before use?
Eh, nothing. You're right, next() doesn't return an element, it just advances, so you still need the current() call. Which seems kinda silly to me, but whatev.
That is documented, so it's OK. 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. -- christopher.jones@oracle.com http://twitter.com/ghrd

« previous php.internals (#64393) next »