2014-07-15 45 views
1

我已經介入了PHP中foreach循環的一個非常有趣的問題。我有一個數組和兩個(非常相似)的foreach循環在一個範圍內聲明。在相同範圍內使用相同變量名稱的兩個foreach(以及使用引用的第一個變量名稱)

有趣的是,如果第二個foreach使用與第一個foreach相同的變量名稱,並且(如果第一個使用對數組項目的引用)(同時),它將無法正常工作。

E.g.

$my_array = array("one", "two", "three", "four"); 
foreach($my_array as &$my_item) { 

} 

foreach($my_array as $my_item) { 
    $second_array[] = $my_item; 
} 

然後$second_array數組不包含"one", "two", "three", "four"但實際上"one", "two", "three", "three"

有人可以向我解釋爲什麼嗎?因爲我真的不知道,這兩個變量應該有不同的範圍,當沒有使用引用時它工作得很好......

//修復很簡單,除了明顯地將兩個foreach循環合併爲其一,它也有助於改變其中一個foreach循環的'item property'名稱(例如$ my_item_1)。問題是,我不想修復它,我想了解它:)。編輯: 這工作正常。

$my_array = array("one", "two", "three", "four"); 
foreach($my_array as $my_item) { 

} 

foreach($my_array as $my_item) { 
    $second_array[] = $my_item; 
} 

這工作得很好。

$my_array = array("one", "two", "three", "four"); 
foreach($my_array as &$my_item) { 

} 

foreach($my_array as $my_item_1) { 
    $second_array[] = $my_item_1; 
} 
+0

你可以填寫第一個循環的身體,這樣我們可以看到它在做什麼?你在那個循環中修改'$ my_item'嗎? –

+0

即使是空的身體,它也可以像我寫的一樣工作(例如,不像人們所期望的那樣)(例如,這些示例的工作方式與帖子中描述的一樣(我已經測試過))。 – Petrroll

回答

3

它在foreach()手冊頁解釋:

警告

參考$ value並且最後一個數組元素的連 foreach循環後依然存在。建議通過unset()銷燬它。

$my_array = array("one", "two", "three", "four"); 
foreach($my_array as &$my_item) { 

} 
unset($my_item); //unset() 

foreach($my_array as $my_item) { 
    $second_array[] = $my_item; 
} 

這裏是一個很好的答案:How 'foreach' actually works

+0

謝謝!我認爲$ value只是在它所屬的foreach的內部範圍內聲明的...... PHP肯定是一種有趣的語言。 – Petrroll

相關問題