Не все нативные функции в PHP оптимизированы.
Например, функции для работы с массивами: array_walk, array_intersect, array_diff - стабильно в два раза проигрывают циклу foreach.
function arrWalk($item, $key, &$arrTestWalk)
{
$arrTestWalk[$key] = strtolower($item);
}
$arrTest = array();
for ($i = 0; $i < 1238; $i++)
{
$time = time();
$arrTest[date("D M j G:i:s T Y", (int) ($time + rand(1, 100))) . rand(1, 100)] = date("D M j G:i:s T Y", (int) ($time + rand(1, 100)));
}
$arrTestForeach = array();
$arrTestWalk = array();
function fArrayWalk($arrTest, &$arrTestWalk) {
array_walk($arrTest, 'arrWalk', $arrTestWalk);
}
function fForeach($arrTest, &$arrTestForeach) {
foreach ($arrTest as $name => $value)
$arrTestForeach[$name] = strtolower($value);
}
$count = 1623;
$s = microtime(true);
for ($i = 0; $i < $count; $i++) {
fArrayWalk($arrTest, $arrTestWalk);
}
printf('fArrayWalk %.5f
', microtime(true) - $s);
$s = microtime(true);
for ($i = 0; $i < $count; $i++) {
fForeach($arrTest, $arrTestForeach);
}
printf('fForeach %.5f', microtime(true) - $s);
Вот такая вот несправедливость. Интересно, пофиксят ли эту неприятность в PHP 6?
Будем надеяться.