我知道在数组上循环的更有效方法是foreach,或者在变量中存储计数以避免多次调用它。 但我很好奇PHP是否有某种“缓存”的东西,如:
for ($i=0; $i<count($myarray); $i++) { /* ... */ }
它是否有类似的东西,我错过了它,或者它没有任何东西,你应该编码:
$count=count($myarray);
for ($i=0; $i<$count; $i++) { /* ... */ }
答案 0 :(得分:15)
PHP完全按照你的说法去做。数组的长度可能会在循环内部发生变化,因此在每次迭代时,您可以 调用count
。 PHP不会试图在这里推断你的意思,也不应该。因此,执行此操作的标准方法是:
for ($i = 0, $length = count($myarray); $i < $length; $i++)
答案 1 :(得分:3)
使用一个非常简单的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
答案 2 :(得分:0)
PHP是一种命令式语言,这意味着不应该来优化任何可能产生任何影响的东西。鉴于它也是一种解释性语言,即使有人真正想要,它也无法安全地完成。
另外,如果你只想迭代数组,你真的想要使用 foreach 。在这种情况下,不仅要复制计数,还要复制整个数组(您可以根据需要修改原始数据)。或者您可以使用foreach ($arr as &$el) { $el = ... }; unset($el);
对其进行修改。我的意思是说PHP(与任何其他语言一样)经常为原始问题提供更好的解决方案(如果有的话)。