2012-10-11 248 views
13

1st off我是PHP新手。我一直在使用for循環,while循環,腳本中的foreach循環。我不知道for循環vs while循環vs foreach循環PHP

  • 哪一個更好的表現?
  • 什麼是選擇循環的標準?
  • 當我們在另一個循環內循環時應該使用哪一個?

我想知道要使用哪個循環的代碼。

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

這是很明顯,我可以使用,而上面寫的代碼。希望有人能幫助我找出哪個循環應該更好使用。

+7

性能無關緊要。 –

+4

在風格上,增量式for循環很少用於在PHP中迭代數組。通常使用'foreach',因爲它可以在循環內提​​供數組鍵和值。 –

回答

23

哪一個更好?

沒關係。

什麼是選擇循環的標準?

如果您只需要遍歷對象或數組的所有元素,請使用foreach。情況下,您需要for包括

  • 當你明確需要做的事情與數字索引,例如:
  • 當你需要內迭代
  • 使用一個或下一個元素在你需要一個迭代

foreach期間改變計數器是更方便,因爲它不要求你設置的計數,並且可以通過任何き工作的方式nd成員 - 無論是對象屬性還是關聯數組元素(for都不會捕獲)。它通常最適合可讀性。

當我們在另一個循環內循環時應該使用哪一個?

兩者都很好;在您的演示案例中,foreach是最簡單的方法。

+0

一個正常數組的'for'循環(奇怪)比'foreach'迭代快一點,但這不是一個很好的使用它的理由。閱讀起來很難,並且不允許我們用任何Traversable來代替普通的數組。 –

+1

@Francis是的。另外,即使在10k元素上運行,性能差異也在*微秒*(請參閱Jason的PHPBench鏈接)。差異確實是毫無意義的。 –

+2

那麼foreach循環實際上會在內存中創建一個變量的副本,以便遍歷它,而你直接用for循環迭代原始變量。除非你處理數以百萬計的元素,否則微不足道的差異。 +1爲真棒回答壽:P –

10

哪一個性能更好?

誰在乎?這並不重要。永遠。如果這些微小的優化很重要,你就不會使用PHP。

什麼是選擇循環的標準?

選擇一個最容易閱讀並且最不可能在將來導致錯誤的閱讀器。當你循環整數時,for循環很棒。當你像一個數組一樣循環播放一個集合時,foreach非常棒,當你需要循環播放直到完成時,while非常棒。

這也可能取決於文體規則(例如,在Python中,您幾乎總是希望使用foreach循環,因爲這是「它在Python中完成的方式」)。我不確定PHP中的標準是什麼。

當我們在另一個循環內循環時應該使用哪一個?

無論哪種循環類型最有意義(請參閱上面的答案)。

在你的代碼中,for循環看起來很自然,因爲你有一個定義的開始和結束索引。

5
  • 出於性能,如果你選擇一個forwhile循環不要緊,迭代次數確定執行時間。
  • 如果您知道正手迭代次數,請選擇for循環。如果你想運行和停止的狀態下,使用while循環
7

檢查http://www.phpbench.com/對一些PHP基準很好的參考。

for循環通常非常快。不包括您的計數($行)或計數($全部)在爲自己,做到這一點以外,像這樣:

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

配售數量($全部)在for循環使得計算這個說法爲每個循環。首先計算值,然後在循環中使用計算使其僅運行一次。

+2

在這裏你都不同意你。基準測試並不重要 - 在200微秒的PHP腳本中,真實世界的差異是什麼?將沒有。看看你展示的代碼,並將其與'foreach($ all)'進行比較。哪個更容易閱讀和維護? –

+0

我同意,再加上foreach也更好閱讀。 for循環有時可能會混淆所有對鍵的引用。 – DevNinjaJeremy

2
  • for循環是比較合適的,當你事先知道有多少 反覆進行
  • While循環在相反的情況下使用(當你不知道需要多少 迭代)
  • For-Each循環在迭代集合時是最好的。

據我所知,很少有與while循環和for循環,我不知道該for-each循環

0

性能沒有性能上的差異: 很容易的去測試。如果你正在做一些類似機器學習或大數據的事情,你應該看看編譯的彙編的而不是解釋的儘管;如果週期真的的問題。 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-while在我的測試中比while更快,但在網上的大多數PHP編碼示例中大部分使用不足。

for被計數控制,所以它迭代特定的次數;儘管我的結果比使用while做得更慢。

while當東西可能以false開頭時很好,所以它可以防止某些東西永遠運行並浪費資源。

do-while至少一次,然後直到條件返回false。這比我的結果中的while循環稍快,但它至少會運行一次。

foreach適用於遍歷arrayobject。儘管你可以通過使用數組語法來使用for語句來循環一個字符串,但是你不能使用foreach來通過PHP來完成它。

控制結構嵌套:這真的取決於你在做什麼決定,同時控制結構嵌套時使用。在一些像面向對象編程的情況下,你實際上需要調用包含你的控制結構(單獨)的函數,而不是使用包含許多嵌套控件的過程風格的大規模程序。這可以使讀取,調試和實例化更容易。