PHP是否能够在循环内缓存计数调用


Is PHP capable of caching count call inside loop?

我知道在数组上进行循环的更有效方法是foreach,或者将计数存储在变量中以避免多次调用它。但我很好奇PHP是否有某种"缓存"的东西,比如:

for ($i=0; $i<count($myarray); $i++) { /* ... */ }

它是否有类似的东西,而我错过了它,或者它没有任何东西,你应该编码:

$count=count($myarray);
for ($i=0; $i<$count; $i++) { /* ... */ }

PHP完全按照您的要求执行。数组的长度可能在循环中发生变化,因此您在每次迭代中调用count可能是有意的。PHP不会试图推断你在这里的意思,也不应该这样做。因此,标准的方法是:

for ($i = 0, $length = count($myarray); $i < $length; $i++)

PHP将在每次循环迭代时执行计数。然而,PHP确实会在内部跟踪数组的大小,所以count是一个相对便宜的操作。PHP并不是在计算数组中的每个元素。但它仍然不是免费的。

使用一个非常简单的1000万项数组进行简单的变量增量,循环内计数版本为2.5秒,循环前计数版本为0.9秒。这是一个相当大的差异,但不是"巨大的"。

编辑:代码:

$x = range(1, 10000000);
$z = 0;
$start = microtime(true);
for ($i = 0; $i < count($x); $i++) {
    $z++;
}
$end = microtime(true);   // $end - $start = 2.5047581195831

切换到进行

$count = count($x);
for ($i = 0; $i < $count; $i++) {

其他一切都一样,时间是0.96466398239136

PHP是一种命令式语言,这意味着不应该优化掉任何可能产生任何效果的东西。考虑到这也是一种解释性语言,即使有人真的想要,也不可能安全地完成。

此外,如果您只是想对数组进行迭代,那么您确实需要使用foreach。在这种情况下,不仅会复制计数,还会复制整个数组(您可以根据需要修改原始数组)。也可以使用foreach ($arr as &$el) { $el = ... }; unset($el);就地修改它。我想说的是,PHP(和任何其他语言一样)通常会为您的原始问题提供更好的解决方案(如果您有)。