PHP 中 foreach和for循环哪个效率更高

for循环遍历(count在内部):

$big_Array = range(0,1000000,1);
    $start_For_Time = microtime_float();
    for ($i=0;$i<count($big_Array);$i++) {  
            $i;
    }
    $end_For_Time = microtime_float();
    $for_Time = $end_For_Time - $start_For_Time;
    echo for循环遍历耗时:.$for_Time.<br>;  
    //for循环遍历(count在内部)耗时:0.039999961853027

for循环遍历(count在外部):

$big_Array = range(0,1000000,1);
    $start_For_Time = microtime_float();
    $array_Count = count($big_Array);
    for ($i=0;$i<$array_Count;$i++) { 
          $i;
    }
    $end_For_Time = microtime_float();
    $for_Time = $end_For_Time - $start_For_Time;
    echo for循环遍历耗时:.$for_Time.<br>;    
    //for循环遍历(count在外部)耗时:0.023999929428101

for循环 数组为固定长度

$start_For_Time = microtime_float();
    for ($i=0;$i<1000000;$i++) {  
            $i;
    }
    $end_For_Time = microtime_float();
    $for_Time = $end_For_Time - $start_For_Time;
    echo for循环遍历耗时:.$for_Time.<br>;   
    //for循环遍历(数组为固定长度)耗时:0.01200008392334

foreach循环遍历:

$big_Array = range(0,1000000,1);
    $start_Foreach_Time = microtime_float();
    foreach ($big_Array as $key=>$val) {
            $key;
    }
	
    $end_Foreach_Time = microtime_float();
    $foreach_Time = $end_Foreach_Time - $start_Foreach_Time;
    echo foreach循环遍历耗时:.$foreach_Time;   // foreach循环遍历耗时:0.019999980926514

时间计算:

/**
 *  时间统计函数
 */
private function microtime_float($time = null)
{
   list($usec, $sec) = explode( , $time ? $time : microtime());
   return ((float)$usec + (float)$sec);
}

从上面的测试中我们可以明显的得出两条结论:

1、在数组长度未知的情况下:
    for(count在内部) < for(count在外部) < foreach(最快)

2、在数组长度已知的情况下:
    for循环比foreach更快

那么第二个问题:效率高的原因是什么呢?在寻找这个答案之前我们先探讨第三个问题,我们看一下原理分别是什么。

for循环

每次从$i开始,每次循环都需要判断$i是否小于count,这占用了很大一部分时间
小于继续,否则终止循环

foreach遍历

foreach 依赖 IEnumerable.
第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,
以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束.
期间GetList()方法只执行一次.
经验分享 程序员 微信小程序 职场和发展