PHP for循环与foreach的范围

时间:2012-12-18 09:02:55

标签: php arrays loops for-loop foreach

哪些对性能和可读性更好?

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

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

编辑:基准测试和最后一次测试的速度快了近6倍。

6 个答案:

答案 0 :(得分:10)

传统的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次的帐户,如果减少迭代次数,则差异较小)。

答案 1 :(得分:6)

如果这很关键,

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

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

但是你不会在1000次迭代中发现太多差异

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

Foreach非常适合迭代使用键和值的数组。

例如,如果我有一个名为'User'的数组:

$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中使用面向对象的练习时,您会发现几乎完全使用foreachfor循环仅用于数字或基于列表的事物。 foreach也会阻止您使用count($array)来查找数组中元素的总数。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

for循环

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

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

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

其中foreach()循环:

foreach()花了11.16920毫秒

使用KEY的

foreach()花了12.35318毫秒

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