2015-05-14 37 views
0

有什麼魔力? $ data的最後一個元素髮生了變化,每個循環後都有2個元素。爲什麼數組的最後一個元素在2個foreach循環後發生了變化?

<?php 
$data = array("1" => "a", "2" => "b"); 
print_r($data); 
foreach($data as $k=>&$v) {} 
foreach($data as $k=>$v) {} 
print_r($data); 

輸出:[2] =>第二的foreach

Array 
(
    [1] => a 
    [2] => b 
) 
Array 
(
    [1] => a 
    [2] => a 
) 

它的代碼變化到這後一個,該陣列將不會改變:

<?php 
foreach($data as $k=>&$v) {} 
foreach($data as $k=>&$v) {} 
+2

由於'&v'。即使在foreach循環之後,也會引用'$ v'和最後一個數組元素。建議使用'unset()'來銷燬它。 – AbraCadaver

+0

我不明白,爲什麼參考更改了原始數組?我對該參考文獻沒有做任何處理 – islq

回答

3

foreach手冊:

警告在foreach循環之後,引用$ value和最後一個數組元素甚至保留爲 。建議通過unset()銷燬它。

所以在第一foreach的端部,是$v到陣列中的最後一個元素的引用。接下來的foreach的第一次迭代將$v的值更改爲對數組中最後一個元素的引用的值(因此它被更改)。

$data = array("1" => "a", "2" => "b"); 
print_r($data); 
foreach($data as $k=>&$v) {} 
unset($v);      // *** UNSET HERE *** 
foreach($data as $k=>$v) {} 
print_r($data); 

結果:

Array 
(
    [1] => a 
    [2] => b 
) 
Array 
(
    [1] => a 
    [2] => b 
) 
+0

爲什麼參考$ value改變了$數據?我對這個參考文獻不做任何處理 – islq

+1

是的。或者說你的第二個foreach循環。它爲'$ v'賦值,該值仍然引用最後一個數組元素。 – ThiefMaster

+0

是的,謝謝@ThiefMaster,我添加了一個描述。 – AbraCadaver

相關問題