PHP for 循环与范围的 foreach [关闭]

Posted

技术标签:

【中文标题】PHP for 循环与范围的 foreach [关闭]【英文标题】:PHP for loop vs. foreach with range [closed] 【发布时间】:2012-12-05 10:51:35 【问题描述】:

在性能和可读性方面,哪一个会更好?

foreach(range(0,10000) as $i)  // 3.847 ms

for($i = 0; $i < 10000; ++$i)  // 0.663 ms

编辑:做了一个基准测试,最后一个快了将近 6 倍。

【问题讨论】:

应该不太重要,但我会大胆猜测并说底部的速度更快,但您可能永远不会注意到差异。 ***.com/questions/771008/for-loop-vs-foreach-in-c 这一切都取决于您的要求和数据。 微性能有时是邪恶的......(将你的注意力从实际存在的瓶颈转移开) 基准测试:3v4l.org/COc0o. 【参考方案1】:

传统的for 循环比foreach + range 更快。第一个只使用整数比较和递增,而最后一个必须创建一个(可能很大的)数组,然后通过移动内部数组光标并检查是否到达末尾来提取每个元素。

如果你执行这个,你可以看到普通的forforeach + range 快两倍:

$t0 = microtime(true);
for ($i = 0; $i < 100000; $i++) 

echo 'for loop: ' . (microtime(true) - $t0) . ' s', php_EOL;

$t0 = microtime(true);
foreach (range(0, 100000) as $i) 

echo 'foreach + range loop: ' . (microtime(true) - $t0) . ' s', PHP_EOL;

最好使用传统的for 作为一种习惯,以防您需要迭代给定次数,但最终在大多数情况下您不会看到很大的性能提升(考虑到上面的例子迭代了100k次,如果减少迭代次数,差异会更小)。

【讨论】:

【参考方案2】:

如果有那么重要,

for($i = 0; $i < 1000; ++$i) 

for($i = 0; $i < 1000; $i++) 

但您不会真正注意到仅 1000 次迭代有太大差异

微优化真的那么重要吗....如果是这样,你为什么不能简单地设置一些测试运行来自己比较不同的选项

【讨论】:

Would'nt for ($i=1000; $i--;) 会更快(尽管反过来)? @adeneo - 可能会更快,可能......但你可以通过使用 --$i 而不是 $i--.... 运行得更快。它仍然需要更多的迭代才能实际看到速度上的任何差异 应该更快,因为没有检查循环是否超过限制,它只是在达到零时自动停止。在大型迭代的 javascript 中,我实际上注意到了一点不同,但从未真正费心在 PHP 中对其进行测试。 @adeneo - 当然,这完全取决于你在循环中所做的事情是否依赖于 $i;如果是这样,顺序是否重要......这是一个很好的技巧,不过我可以看到它的几个用途 @adeneo 在这种情况下,最好使用while(--$i) ,它更具可读性并且可能更快。【参考方案3】:

比较一些php函数的执行速度

for 循环占用

for() 循环 using count() 耗时 20.86401 毫秒

for() 循环 Not using count() 耗时 7.09796 毫秒

使用 count() 意味着: for ($i = 1; $i &lt; count($myarr); ++ $i) ..

foreach() 循环在哪里:

foreach() 耗时 11.16920 毫秒

foreach() with KEY 耗时 12.35318 毫秒

这两个都是在同一个数组上完成的,它们各自的执行时间显示在 forforeach 都是语言结构,它们的执行速度会更快,所以除非你在数组上使用它们,否则你不会注意到更多的差异拥有数千条记录。

【讨论】:

【参考方案4】:

Foreach 非常适合遍历使用键和值的数组。

例如,如果我有一个名为“用户”的数组:

$User = array(
    'name' => 'Bob',
    'email' => 'bob@example.com',
    'age' => 200
);

我可以很容易地遍历它并且仍然使用键:

foreach ($User as $key => $value) 
    echo $key.' is '.$value.'<br />';

这会打印出来:

name is Bob
email is bob@example.com
age is 200

使用for 循环,更难保留键的使用。

当您在 PHP 中使用面向对象的实践时,您会发现您将几乎完全使用 foreach,而 for 循环仅用于数字或基于列表的事物。 foreach 还可以让您不必使用 count($array) 来查找数组中的元素总数。

【讨论】:

使用for循环,迭代关联数组并不难。只需通过array_keys() 检索密钥并保持不变。【参考方案5】:

Foreach 非常适合遍历使用键和值的数组。 使用 for 循环,保留键的使用变得更加困难。 http://www.c-sharpcorner.com/interviews/answer/2147/这可能会有所帮助

【讨论】:

【参考方案6】:

在这种特殊情况下(使用range() 而不是从另一个范围传递的数组)-foreach() 会更快。 for() 几乎在任何其他情况下都会击败它。

【讨论】:

以上是关于PHP for 循环与范围的 foreach [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Php多维数组与混合for和Foreach循环

PHP 变量范围 - 在 foreach 循环中设置全局变量

请问php中如何用for循环遍历出关联数组,不要用foreach,用for循环哦

增强for循环 -- foreach循环

for循环与forEach循环的区别

php中的for 和foreach性能对比