Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP能够在循环内缓存计数调用吗?_Php - Fatal编程技术网

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

PHP能够在循环内缓存计数调用吗?,php,Php,我知道使用数组上的循环更有效的方法是foreach,或者将count存储在变量中以避免多次调用它。 但我很好奇PHP是否有一些“缓存”功能,比如: for ($i=0; $i<count($myarray); $i++) { /* ... */ } for($i=0;$iPHP完全按照您的指示执行。数组的长度在循环中可能会发生变化,因此您在每次迭代中调用count可能是有意的。PHP不会试图推断您在这里的意思,也不应该这样做。因此,执行此操作的标准方法是: for ($i = 0, $l

我知道使用数组上的循环更有效的方法是foreach,或者将count存储在变量中以避免多次调用它。 但我很好奇PHP是否有一些“缓存”功能,比如:

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

for($i=0;$iPHP完全按照您的指示执行。数组的长度在循环中可能会发生变化,因此您在每次迭代中调用
count
可能是有意的。PHP不会试图推断您在这里的意思,也不应该这样做。因此,执行此操作的标准方法是:

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

每次循环迭代时,PHP都会执行计数。然而,PHP确实会对数组的大小进行内部跟踪,因此计数是一个相对便宜的操作。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
$x=范围(1100000);
$z=0;
$start=microtime(真);
对于($i=0;$i
转行

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

除此之外,其他一切都是一样的,时间是0.96466398239136

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


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

特别是考虑到这样大小的数组。这很好,尽管我更喜欢在循环控制结构之外初始化$length,以防我需要在代码中的其他地方引用它。@Mike取决于用途。如果
$length
仅在循环中使用,则将其放入循环初始化中更为惯用c、 如果你在别处明确需要它,你应该在循环之外初始化它。我不同意整个数组会被复制,因为PHP是一种写时复制语言。
$count = count($x);
for ($i = 0; $i < $count; $i++) {