【问题标题】:The difference between loops循环之间的区别
【发布时间】:2010-09-06 13:44:53
【问题描述】:

这是关于 PHP 的,但我毫不怀疑许多相同的 cmets 将适用于其他语言。

简单来说,PHP 不同类型的循环有什么区别?一个比其他更快/更好,还是我应该简单地放入最易读的循环?

for ($i = 0; $i < 10; $i++)
{
    # code...
}


foreach ($array as $index => $value)
{
    # code...
}


do
{
    # code...
}
while ($flag == false);

【问题讨论】:

  • 性能很少是选择循环的动机因素。

标签: php loops


【解决方案1】:

For 循环和 While 循环是入口条件循环。他们首先评估条件,因此即使条件不满足,与循环关联的语句块也不会运行一次

这个for循环块里面的语句会运行10次,$i的值是0到9;

for ($i = 0; $i < 10; $i++)
{
        # code...
}

用while循环做同样的事情:

$i = 0;
while ($i < 10)
{
    # code...
    $i++
}

Do-while 循环是退出条件循环。它保证执行一次,然后它会在重复块之前评估条件

do
{
        # code...
}
while ($flag == false);

foreach 用于从头到尾访问数组元素。在 foreach 循环开始时,将数组的内部指针设置为数组的第一个元素,下一步将其设置为数组的第二个元素,依此类推,直到数组结束。在循环块中,当前数组项的值以 $value 的形式提供,当前项的键以 $index 的形式提供。

foreach ($array as $index => $value)
{
        # code...
}

你可以用while循环做同样的事情,像这样

while (current($array))
{
    $index = key($array);  // to get key of the current element
    $value = $array[$index]; // to get value of current element

    # code ...  

    next($array);   // advance the internal array pointer of $array
}

最后:The PHP Manual 是你的朋友 :)

【讨论】:

    【解决方案2】:

    这是 CS101,但由于没有其他人提到它,while 循环在代码块之前评估它们的条件,而 do-while 在代码块之后评估它们,所以 do-while 循环总是保证运行它们的代码块至少一次,无论条件如何。

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        @brendan:

        您引用的文章严重过时,信息完全错误。尤其是最后一点(使用 for 而不是 foreach)具有误导性,并且文章中提供的理由不再适用于现代版本的 .NET。

        虽然IEnumerator 确实使用了虚拟调用,但这些可以实际上由现代编译器内联。此外,.NET 现在知道泛型和强类型枚举器。

        有很多性能测试最终证明for 通常不比foreach 快。 Here's an example.

        【讨论】:

        • 链接已失效。
        【解决方案5】:

        我在遍历常规(索引?)数组时使用第一个循环,在处理关联数组时使用 foreach 循环。在我看来,它看起来很自然,有助于代码流动并更具可读性。至于 do...while 循环,当我需要做的不仅仅是遍历数组时,我会使用它们。

        不过,我不确定是否有任何性能优势。

        【讨论】:

          【解决方案6】:

          在这两种情况下,性能都没有明显提高。虽然对于比迭代更复杂的任务有用,但forwhile 在功能上是等效的。

          Foreach 很好,但有一个重要的警告:你不能修改你正在迭代的枚举。因此,不要删除、添加或替换其中的条目。当然,修改条目(比如更改它们的属性)是可以的。

          【讨论】:

            【解决方案7】:

            使用 foreach 循环,在内存中制作原始数组的副本以供内部使用。你不应该在大型结构上使用它们;一个简单的 for 循环是更好的选择。您可以在像这样的大型非数字索引结构上更有效地使用 while 循环:

            while(list($key, $value) = each($array)) {
            

            但是这种方法对于一个简单的小结构来说特别难看。

            while 循环更适合在流中循环,或者像下面在 PHP 中经常看到的示例:

            while ($row = mysql_fetch_array($result)) {
            

            几乎所有时候不同的循环都是可以互换的,这将归结为a)效率或b)清晰度。

            如果您知道不同类型循环的效率权衡,那么可以回答您最初的问题:使用看起来最干净的循环。

            【讨论】:

              【解决方案8】:

              每个循环结构都有不同的用途。

              for - 用于循环特定次数的迭代。

              foreach - 用于循环遍历集合中的所有值。

              while - 用于循环直到满足条件。

              在这三个中,“while”最有可能在大多数情况下提供最佳性能。当然,如果您执行以下操作,则基本上是在重写“for”循环(在 c# 中它的性能略高一些)。

              $count = 0;
              do
              {
                 ...
                 $count++;
              }
              while ($count < 10);  
              

              它们都有不同的基本用途,但也可以以相同的方式使用。这完全取决于您要解决的具体问题。

              【讨论】:

                【解决方案9】:

                使用 foreach 循环,在内存中制作原始数组的副本以供内部使用。

                Foreach 很好,但有一个重要的警告:你不能修改你正在迭代的枚举。

                如果你通过引用而不是值传递,这两个都不是问题:

                 foreach ($array as &$value) {
                

                我认为从 PHP 5 开始就允许这样做了。

                【讨论】:

                  【解决方案10】:

                  在访问数组元素时,为清楚起见,我会尽可能使用 foreach,并且仅在需要实际索引值时才使用 for(例如,多个数组中的相同索引)。这也最大限度地减少了拼写错误的机会,因为 for 循环使这一切变得太容易了。一般来说,PHP 可能不是过分担心性能的地方。最后但并非最不重要的一点是,for 和 foreach 具有(或应该具有;我不是 PHP-er)相同的 Big-O 时间(O(n)),因此您可能正在查看更多的内存使用量或轻微的恒定或线性时间冲击。

                  【讨论】:

                    【解决方案11】:

                    在性能方面,foreach 比 for 消耗更多

                    http://forums.asp.net/p/1041090/1457897.aspx

                    【讨论】:

                      猜你喜欢
                      • 2021-05-12
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-04-07
                      • 2013-05-20
                      • 2016-07-08
                      • 2019-01-11
                      • 1970-01-01
                      • 2010-09-29
                      相关资源
                      最近更新 更多