2012-07-25 57 views
0

可能重複:
Strange behavior Of foreach
Strange behaviour after loop by reference - Is this a PHP bug?的foreach和參考

我有用foreach一個問題,我無法理解第二的foreach。

爲什麼$ foo數組的第三部分的值爲'two'!

儘管我們知道,如果我們刪除'&'(在第一個foreach中),問題將解決,但爲什麼?

<?php 

$foo = array('one', 'two', 'three'); 

foreach ($foo as &$bar) 
{ 
// no-op 
} 

var_dump($foo); 

foreach ($foo as $bar) 
{ 
// no-op 
} 

var_dump($foo); 
?> 
############################################### 

生產:

array(3) { 
    [0]=>string(3) "one" 
    [1]=>string(3) "two" 
    [2]=>&string(5) "three" 
    } 
    array(3) { 
    [0]=>string(3) "one" 
    [1]=>string(3) "two" 
    [2]=>&string(3) "two" 
    } 
+3

這第二的foreach基本上是:'的foreach($ foo的爲$ foo的[2])'。因此,每次迭代時,都會使用當前元素更新$ foo的最後一個元素。而且由於最後一個元素丟失了,你最終會在倒數第二個位置結束。 – Matthew 2012-07-25 19:18:42

回答

1

the docs

一個$值和最後一個數組元素的參考foreach循環後仍保持。建議通過unset()銷燬它。

所以你的情況:

<?php 

$foo = array('one', 'two', 'three'); 

foreach ($foo as &$bar) 
{ 
    // no-op 
} 

var_dump($foo); 

unset($bar); 

foreach ($foo as $bar) 
{ 
// no-op 
} 

var_dump($foo); 
?> 
+0

我會把這稱爲一個錯誤,沒想到它會被記錄下來。在測試過程中,我還發現,循環之間的「未設置」確實可以解決問題。 – Joost 2012-07-25 19:18:44

+0

謝謝,我知道我們可以使用未設置。 但我不明白爲什麼'&'會改變數組的值?! – 2012-07-25 19:23:54

+0

請參閱[馬修的評論](http://stackoverflow.com/questions/11656915/foreach-and-reference/11656964#comment15447102_11656915)。 – PeeHaa 2012-07-25 19:24:54

0

在你使用的是與 '&' 符號引用第一的foreach,因此它們的值實際上修改。我不知道第一個foreach裏面的內容是什麼,但是你覆蓋了舊的值,這就是爲什麼你的第二個foreach值與開始時不一樣。

編輯有一個在這個post一個整潔的答案,或者只是使用取消設置爲推薦

+1

您是否嘗試過在問題中運行代碼?它產生的輸出,並沒有(明顯的)重寫,只是兩個foreach循環。 – andrewsi 2012-07-25 19:19:07