-
1 # 匠工加工
-
2 # 小白兔修車
HP中的&傳值引用的問題,在foreach迴圈的結果能幫解釋下輸出的結果原理是什麼?
程式碼如下:
$arr = array("one","two","three");
foreach ($arr as &$value){ echo "Value:".$value."
"; }
foreach ($arr as $value){ echo "Value:".$value."
"; }
?>
輸出結果:
Value:one
Value:two
Value:three
Value:one
Value:two
Value:two
第一次帶&的foreach並沒有改變陣列的內容。。
而是最後一次迴圈$value引用了陣列的最後一個項 (可以測試一下,在第一次迴圈結束後unset($value),第二次迴圈的結果就不會有變化),
在你第二個foreach也是使用的$value變數,這才造成了怪異的問題(可以換個變數,比如$val,輸出的陣列就不會有變化)。
第二個foreach是賦值給$value,但是這時的$value是引用的陣列的最後一個值,
所以
第一次迴圈把one賦值給了最後一個值,
第二次把two賦值給最後一個,
第三次也就是最後一個已經在第二次迴圈被賦值為two,所以仍然是two。
-
3 # 變餅檔
第一次帶&的foreach並沒有改變陣列的內容。。
而是最後一次迴圈$value引用了陣列的最後一個項 (可以測試一下,在第一次迴圈結束後unset($value),第二次迴圈的結果就不會有變化),
在你第二個foreach也是使用的$value變數,這才造成了怪異的問題(可以換個變數,比如$val,輸出的陣列就不會有變化)。
第二個foreach是賦值給$value,但是這時的$value是引用的陣列的最後一個值,
所以
第一次迴圈把one賦值給了最後一個值,
第二次把two賦值給最後一個,
第三次也就是最後一個已經在第二次迴圈被賦值為two,所以仍然是two。
回覆列表
修改了一下,感覺這樣你應該能理解的了了。
感覺你在一個誤區裡面。。
第一次帶&的foreach並沒有改變陣列的內容。。而是最後一次迴圈$value引用了陣列的最後一個項
(可以測試一下,在第一次迴圈結束後unset($value),第二次迴圈的結果就不會有變化),
在你第二個foreach也是使用的$value變數,這才造成了怪異的問題(可以換個變數,比如$val,輸出的陣列就不會有變化)。
第二個foreach是賦值給$value,但是這時的$value是引用的陣列的最後一個值,所以,第一次迴圈把one賦值給了最後一個值,第二次把two賦值給最後一個,第三次也就是最後一個已經在第二次迴圈被賦值為two,所以仍然是two。