while - w3school php post




循環之間的差異 (8)

使用foreach循環,原始數組的副本在內存中進行使用。

Foreach很好,但有一個重要的警告:你不能修改你正在迭代的枚舉。

如果您通過引用而不是價值傳遞,那麼這兩者都不會成為問題:

 foreach ($array as &$value) {

我認為這已經被允許自PHP 5。

這是關於PHP,但我毫不懷疑,許多相同的意見將適用於其他語言。

簡而言之,PHP的不同類型的循環有什麼區別? 是比其他人更快/更好,還是我應該簡單地把最可讀的循環?

for ($i = 0; $i < 10; $i++)
{
    # code...
}


foreach ($array as $index => $value)
{
    # code...
}


do
{
    # code...
}
while ($flag == false);

@brendan:

你引用的這篇文章嚴重過時,信息顯然是錯誤的。 特別是最後一點( for代替foreach )是誤導性的,文中提供的理由不再適用於.NET的現代版本。

雖然IEnumerator確實使用虛擬調用,但實際上它們可以由現代編譯器內聯。 此外,.NET現在知道泛型和強類型的枚舉。

有很多性能測試結果證明,通常不會比foreach快。 這是一個例子


使用foreach循環,原始數組的副本在內存中進行使用。 你不應該在大型結構上使用它們。 一個簡單的循環是一個更好的選擇。 您可以更有效地在一個大的非數字索引結構上使用while循環,如下所示:

while(list($key, $value) = each($array)) {

但是對於一個簡單的小結構來說,這種方法尤其難看。

while循環更適合循環流,或者像下面的例子那樣在PHP中非常頻繁地看到:

while ($row = mysql_fetch_array($result)) {

幾乎所有的時間,不同的循環是可以互換的,並且可以歸結為a)效率,或者b)清晰度。

如果你知道不同類型的循環的效率權衡,那麼是的,回答你原來的問題:使用看起來最乾淨的那個。


在處理關聯數組時,我使用第一個循環遍歷常規(索引?)數組和foreach循環。 在我看來,這看起來很自然,有助於代碼流動,並且更具可讀性。 至於do ... while循環,當我不得不做更多的操作時,我使用這些循環。

不過,我不確定任何性能優勢。


每個循環構造服務於不同的目的。

for - 這用於循環執行特定次數的迭代。

foreach - 這用於循環集合中的所有值。

而 - 這是用來循環,直到你遇到一個條件。

在這三者中,“同時”在大多數情況下最有可能提供最好的表現。 當然,如果你做了類似以下的事情,你基本上是重寫“for”循環(在C#中稍微表現一些)。

$count = 0;
do
{
   ...
   $count++;
}
while ($count < 10);  

它們都有不同的基本目的,但也可以用相同的方式使用。 這完全取決於你正在努力解決的具體問題。


當訪問一個數組的元素時,為了清晰起見,我將盡可能使用foreach,並且只有在需要實際索引值(例如,多個數組中的相同索引)時才使用for。 這也最大限度地減少了輸入錯誤的機會,因為for循環使得這一切變得非常簡單。 一般來說,PHP可能不是太擔心性能的地方。 最後但並非最不重要的是,對於和foreach(或者應該有;我不是一個PHP-er)相同的大O時間(O(n)),所以你正在尋找少量的內存使用量或時間有輕微的不變或線性打擊。


For循環和While循環是進入條件循環。 它們首先評估條件,所以如果條件不符合,與循環相關的語句塊將不會運行一次

這個for循環塊內的語句將運行10次,$ i的值將是0到9;

for ($i = 0; $i < 10; $i++)
{
        # code...
}

while循環完成同樣的事情:

$i = 0;
while ($i < 10)
{
    # code...
    $i++
}

Do-while循環是退出條件循環。 保證執行一次,然後在重複塊之前評估條件

do
{
        # code...
}
while ($flag == false);

foreach用於從頭到尾訪問數組元素。 在foreach循環的開始處,數組的內部指針被設置為數組的第一個元素,下一步被設置為數組的第二個元素,依此類推直到數組結束。 在循環塊中當前數組項目的值可用作$ value,當前項目的鍵值可用作$ index。

foreach ($array as $index => $value)
{
        # code...
}

你可以用while循環做同樣的事情,像這樣

while (current($array))
{
    $index = key($array);  // to get key of the current element
    $value = $array[$index]; // to get value of current element

    # code ...  

    next($array);   // advance the internal array pointer of $array
}

最後: PHP手冊是你的朋友:)






loops