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

Sto*_*yte 5 php

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

for ($i=0; $i<count($myarray); $i++) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

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

$count=count($myarray);
for ($i=0; $i<$count; $i++) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 15

PHP完全按照你的说法去做.数组的长度可在循环内改变,因此它可能是故意的,我们在调用count每个迭代.PHP不会试图在这里推断你的意思,也不应该.因此,执行此操作的标准方法是:

for ($i = 0, $length = count($myarray); $i < $length; $i++)
Run Code Online (Sandbox Code Playgroud)

  • @Mike取决于目的.如果`$ length`仅在循环内部使用,则将其置于循环初始化中更为惯用.如果你在其他地方明确需要它,你应该在循环之外初始化它. (3认同)

Mar*_*c B 5

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
Run Code Online (Sandbox Code Playgroud)

切换做

$count = count($x);
for ($i = 0; $i < $count; $i++) {
Run Code Online (Sandbox Code Playgroud)

否则一切都一样,时间是 0.96466398239136