for循环vs while循环vs foreach循环PHP

for循环vs while循环vs foreach循环PHP,php,performance,loops,nested-loops,control-structure,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 } } $i=0;$i的 哪一个

首先,我是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 
 }
}
$i=0;$i的

哪一个性能更好

没关系

选择循环的标准是什么

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

  • 当您明确需要处理数字索引时,例如:
  • 当您需要在迭代中使用上一个或下一个元素时
  • 在迭代过程中需要更改计数器时
foreach
更为方便,因为它不需要您设置计数,并且可以通过任何类型的成员进行计算-无论是对象属性还是关联数组元素(for
不会捕捉到这些元素)。通常,它的可读性最好

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

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

哪一个性能更好

谁在乎呢?这不会有什么意义。永远不会。如果这些微小的优化很重要,你就不会使用PHP了

选择循环的标准是什么

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

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

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

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

在您的代码中,我觉得
for
循环非常自然,因为您有一个定义的开始和停止索引。

  • 对于性能而言,无论是为
选择一个
,还是在
循环时选择一个
,迭代次数都决定执行时间
  • 如果您知道正手时的迭代次数,请为
  • 循环选择一个
    。如果您想在某个条件下运行并停止,请使用
    while
    循环 检查一些PHP基准测试的良好参考

    for循环通常非常快。不要将count($rows)或count($all)包含在for循环中,在for循环外部执行,就像这样:

    $count_all = count($all);
    for($i=0;$i<$count_all;$i++)
    {
        // Code here
    }
    
    $count\u all=count($all);
    对于($i=0;$i
    • 当您提前知道有多少时,for循环更合适 要执行的迭代
    • While循环用于相反的情况(当您不知道有多少 (需要迭代)
    • 当您必须迭代集合时,For Each循环是最好的
    就我所知,while循环和for循环之间的性能差别很小,甚至没有。我不知道for-each循环的性能:

    很容易测试。如果你在做机器学习或大数据之类的事情,你应该真正看看那些经过编译或组装而不是解释的东西;如果周期真的很重要的话。看起来像是
    do,而
    loop在我使用
    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);
    
    “.PHP_EOL; } echo“执行时间:$total

    ”。PHP\u EOL; } } 结果($数组);
    标准:,和是大多数人在PHP中使用的主要控制结构。在我的测试中比
    更快,但在web上的大多数PHP编码示例中基本上没有得到充分利用

    for
    是计数控制的,因此它会迭代特定的次数;尽管在我自己的结果中,它比使用
    while
    进行相同的操作要慢

    while
    在某些东西可能以
    false开始时是好的,因此它可以防止某些东西运行和浪费资源

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

    foreach
    适用于迭代
    数组
    对象
    。即使可以使用数组语法使用
    for
    语句循环字符串,也不能在PHP中使用foreach


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

    这与性能无关。从风格上讲,增量
    for
    循环很少用于在PHP中迭代数组。
    foreach
    通常用于替代,因为它可以提供循环中的数组键和值。使用普通数组的
    循环的
    是(奇怪的)比
    foreach
    迭代快一点,但这并不是使用它的好理由。它更难阅读,也不允许我们用任何可遍历数组来代替普通数组。@Francis是的。此外,即使在10k元素上运行,性能差异也只有微秒(请参阅Jason的PHPBench链接).差别真的完全没有意义。foreach循环实际上在我体内创建了变量的副本