Laruence,
> foreach ($replacements as $regex => $callback) {
> > $str = preg_replace_callback($regex, $callback, $str);
> > }
> >
>
> So if there are 10 regex in the array, you will got 10 DO_FCALL. 10 times
> arguments accept, 10 times etc...
>
> and AS I already said: IT is inefficient. I personally can not accept it.
>
> thanks
>
>
My initial reaction was that the difference in runtime is going to be so
insignificant that it's the very definition of a micro-optimization between
the two. And unless you're doing it millions of times in a hot-loop, it's
never even going to be realized. I was going to reply to that effect.
Then I decided to write a quick test.
$count = 100;
$start = microtime(true);
for ($i = 0; $i < $count; $i++) {
$str = "abc";
$str = preg_replace_callback('/a/', function($a) { return
strtoupper($a[0]); }, $str);
$str = preg_replace_callback('/b/', function($a) { return
strtoupper($a[0]); }, $str);
$str = preg_replace_callback('/c/', function($a) { return
strtoupper($a[0]); }, $str);
$str = preg_replace_callback('/a/', function($a) { return
strtolower($a[0]); }, $str);
$str = preg_replace_callback('/b/', function($a) { return
strtolower($a[0]); }, $str);
$str = preg_replace_callback('/c/', function($a) { return
strtolower($a[0]); }, $str);
}
echo "Completed in " . (microtime(true) - $start) . " Seconds\n";
$start = microtime(true);
for ($i = 0; $i < $count; $i++) {
$str = "abc";
$str = preg_replace(array(
'/a/e',
'/b/e',
'/c/e',
'/a/e',
'/b/e',
'/c/e',
),
array(
'strtoupper(\'$1\')',
'strtoupper(\'$1\')',
'strtoupper(\'$1\')',
'strtolower(\'$1\')',
'strtolower(\'$1\')',
'strtolower(\'$1\')',
),
$str
);
}
echo "Completed in " . (microtime(true) - $start) . " Seconds\n";
So basically, it's comparing the old behavior (one call to preg_replace)
that you want to emulate, with what Nikita is suggesting.
I ran it on 3v4l (http://3v4l.org/dRjtU) and the results were quite
surprising. I was expecting the first to be slightly slower than the
second. But the reality surprised me:
Completed in 0.00076389312744141 Seconds Completed in 0.0012428760528564
Seconds
As it turns out, calling preg_replace_callback() multiple times is almost
50% faster than using a single call to preg_replace().
It's likely due to the precompiled nature of closures, vs the compilation
happening multiple times at invocation in the preg_replace /e case.
But it's still worth noting that switching from the /e style to a more
traditional preg_replace_callback implementation will get you a significant
boost in performance of that.
Now, keep in mind, we're talking 0.000005 seconds saved per "execution"
(group of 6 replacements). So it's not likely to matter much or be worth
worrying about...
My $0.02 at least...
Anthony