for loop vs while loop vs foreach循环PHP

时间:2012-10-11 19:58:23

标签: php performance loops nested-loops control-structure

第一关我是PHP的新手。我一直在使用for循环,while循环,foreach循环脚本。我想知道

  • 哪一个更适合表现?
  • 选择循环的标准是什么?
  • 当我们在另一个循环中循环时应该使用
  • 吗?

我遇到的代码想知道要使用哪个循环。

for($i=0;$i<count($all);$i++)
{
 //do some tasks here
 for($j=0;$j<count($rows);$j++)
 {
  //do some other tasks here 
 }
}

很明显我可以用while编写上面的代码。希望有人能帮助我找出哪个循环应该更好用。

6 个答案:

答案 0 :(得分:34)

  

哪一个更适合表现?

没关系。

  

选择循环的标准是什么?

如果您只需要遍历对象或数组的所有元素,请使用foreach。您需要 for的案例包括

  • 当您明确需要使用数字索引时,例如:
  • 当您需要使用迭代中的上一个或下一个元素时
  • 当您需要在迭代期间更改计数器时

foreach更方便,因为它不需要你设置计数,并且可以通过任何类型的成员 - 无论是对象属性还是关联数组元素({{1}不会抓住)。这通常是最好的可读性。

  

当我们在另一个循环中循环时应该使用哪个?

两者都很好;在您的演示案例中,for是最简单的方法。

答案 1 :(得分:13)

  

哪一个更适合表现?

谁在乎?这不会很重要。永远。如果这些微小的优化很重要,那么就不会使用PHP。

  

选择循环的标准是什么?

选择一个最容易阅读的,最不可能在将来导致错误。当你循环整数时,for循环很棒。当您像数组一样循环遍历集合时,foreach很棒,当您需要循环直到“完成”时,while很棒。

这也可能取决于样式规则(例如,在Python中,你几乎总是想要使用foreach循环,因为这是“在Python中完成的方式”)。我不确定PHP的标准是什么。

  

当我们在另一个循环中循环时应该使用哪个?

无论哪种循环类型最有意义(参见上面的答案)。

在你的代码中,for循环对我来说似乎很自然,因为你有一个已定义的开始和停止索引。

答案 2 :(得分:7)

检查http://www.phpbench.com/以获取一些PHP基准测试的良好参考。

for循环通常非常快。不包括你自己的计数($ rows)或count($ all),在外面这样做:

$count_all = count($all);
for($i=0;$i<$count_all;$i++)
{
    // Code here
}

将计数($ all)放在for循环中使得它为每个循环计算此语句。首先计算该值,然后在循环中使用计算使其仅运行一次。

答案 3 :(得分:5)

  • 对于性能而言,如果选择forwhile循环并不重要,迭代次数将决定执行时间。
  • 如果您知道正手的迭代次数,请选择for循环。如果要在某个条件下运行和停止,请使用while循环

答案 4 :(得分:2)

    当你事先知道多少时,
  • for循环更合适 迭代执行
  • 虽然循环用于相反的情况(当你不知道有多少时) 需要迭代)
  • 当你必须遍历集合时,For-Each循环是最好的。

据我所知,while循环和for循环之间几乎没有性能差异我不知道for-each循环

答案 5 :(得分:1)

<强> 性能: 很容易测试。如果你正在做机器学习或大数据之类的事情,你应该真正看一下编译汇编而不是解释的东西;如果周期真的很重要。 Here are some benchmarks between the various programming languages. do-while循环似乎是我的系统使用PHP获得这些示例的胜利者。

$my_var = "some random phrase";

function fortify($my_var){
    for($x=0;isset($my_var[$x]);$x++){
        echo $my_var[$x]." ";
    }
}

function whilst($my_var){
    $x=0;
    while(isset($my_var[$x])){
       echo $my_var[$x]." ";
       $x++;
    }
}

function dowhilst($my_var){
    $x=0;
    do {
       echo $my_var[$x]." ";
       $x++;
    } while(isset($my_var[$x]));
}

function forstream(){
    for($x=0;$x<1000001;$x++){
        //simple reassignment
        $v=$x;
    }
    return "For Count to $v completed";
}

function whilestream(){
    $x=0;
    while($x<1000001){
        $v=$x;
        $x++;
    }
    return "While Count to 1000000 completed";
}

function dowhilestream(){
    $x=0;
    do {
        $v=$x;
        $x++;
    } while ($x<1000001);
    return "Do while Count to 1000000 completed";
}

function dowhilestream2(){
    $x=0;
    do {
        $v=$x;
        $x++;
    } while ($x!=1000001);
    return "Do while Count to 1000000 completed";
}

$array = array(
    //for the first 3, we're adding a space after every character.
        'fortify'=>$my_var,
        'whilst'=>$my_var,
        'dowhilst'=>$my_var,
   //for these we're simply counting to 1,000,000 from 0
   //assigning the value of x to v 
        'forstream'=>'',
        'whilestream'=>'',
        'dowhilestream'=>'',
   //notice how on this one the != operator is slower than
   //the < operator
        'dowhilestream2'=>''
        );

function results($array){
    foreach($array as $function=>$params){


      if(empty($params)){
        $time= microtime();
        $results = call_user_func($function);  
      } elseif(!is_array($params)){
        $time= microtime();  
        $results = call_user_func($function,$params);
      } else {
        $time= microtime();  
        $results = call_user_func_array($function,$params);
      }
      $total = number_format(microtime() - $time,10);
      echo "<fieldset><legend>Result of <em>$function</em></legend>".PHP_EOL;
      if(!empty($results)){
          echo "<pre><code>".PHP_EOL;
          var_dump($results);
          echo PHP_EOL."</code></pre>".PHP_EOL;
      }
      echo "<p>Execution Time: $total</p></fieldset>".PHP_EOL;
    }
}

results($array);

标准: whileforforeach是大多数人在PHP中使用的主要控制结构。在我的测试中,do-whilewhile更快,但在网络上的大多数PHP编码示例中基本上都没有得到充分利用。

for是计数控制的,因此它会迭代特定次数;虽然我自己的结果比使用while同样的事情要慢。

while在某些事情可能以false开头时很好,因此它可以防止某些事情继续运行并浪费资源。

do-while至少一次,然后直到条件返回false。它比我的结果中的while循环快一点,但它至少会运行一次。

foreach适合迭代arrayobject。即使您可以使用数组语法循环使用for语句的字符串,但是在PHP中也不能使用foreach来执行此操作。

控制结构嵌套: 这实际上取决于您在嵌套时使用的控件结构确定的内容。在某些情况下,如面向对象编程,您实际上想要调用包含控件结构的函数(单独),而不是使用包含许多嵌套控件的过程样式的大型程序。这可以使它更容易阅读,调试和实例化。