22

第一关我是 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 编写上述代码。希望有人能帮助我找出应该更好地使用哪个循环。

4

6 回答 6

34

哪一个对性能更好?

没关系。

选择循环的标准是什么?

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

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

foreach更方便,因为它不需要您设置计数,并且可以通过任何类型的成员工作 - 无论是对象属性还是关联数组元素(afor不会捕获)。它通常最适合可读性。

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

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

于 2012-10-11T20:00:56.483 回答
16

哪一个对性能更好?

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

选择循环的标准是什么?

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

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

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

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

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

于 2012-10-11T20:01:15.343 回答
7

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

for 循环通常非常快。不要在 for 本身中包含您的 count($rows) 或 count($all) ,请在外面这样做:

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

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

于 2012-10-11T20:01:43.373 回答
6
  • 对于性能而言,选择循环for还是while循环并不重要,迭代次数决定了执行时间。
  • 如果您知道正手的迭代次数,请选择一个for循环。如果要在某个条件下运行和停止,请使用while循环
于 2012-10-11T20:01:27.913 回答
2
  • 当您提前知道要执行多少次迭代时,for 循环更合适
  • While 循环用于相反的情况(当你不知道需要多少次迭代时)
  • 当您必须迭代集合时,For-Each 循环是最好的。

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

于 2012-10-11T20:03:56.297 回答
2

性能: 很容易测试。如果您正在做机器学习或大数据之类的事情,那么您应该真正查看已编译组装而不是解释的东西;如果周期真的很重要。以下是各种编程语言之间的一些基准。看起来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);

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

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

while当某些东西可能以 开头时很好false,因此它可以防止某些东西运行和浪费资源。

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

foreach有利于遍历arrayor object。即使您可以for使用数组语法通过语句循环遍历字符串,但在 PHP 中却不能使用 foreach 来执行此操作。

控制结构嵌套:这实际上取决于您在做什么来确定嵌套时使用的控制结构。在某些情况下,例如面向对象编程,您实际上希望(单独)调用包含您的控制结构的函数,而不是使用包含许多嵌套控件的过程风格的大量程序。这可以使其更易于阅读、调试和实例化。

于 2017-09-17T22:05:09.963 回答