1. 程式人生 > >php foreach中使用了傳值引用&賦值可能造成的問題

php foreach中使用了傳值引用&賦值可能造成的問題

foreach語句在使用的時候,如果需要改變元素的值,可以將其賦予另一個數組,也可以使用傳值引用:

foreach($arr as $key=>&$value){

  ..

{

上面的語句相當於迴圈的傳值引用:

        $value=&$arr[$key]

foreach迴圈結束後,最後一個$value將會被保留,即$value會保持與$arr最後一個元素建立的傳值引用關係.

如果接下來重啟一個foreach迴圈,且還是用$value來賦值的話,$value被賦值的同時,由於存在傳值引用,之前的陣列的最後一個元素也會被改變

下面是一個在PHP手冊上的例子

<?php
$arr1 = array("a" => 1, "b" => 2, "c" => 3);
$arr2 = array("x" => 4, "y" => 5, "z" => 6);

foreach ($arr1 as $key => &$val) {}
foreach ($arr2 as $key => $val) {}

var_dump($arr1);
var_dump($arr2);
?>

The output is:
array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> &int(6) }
array(3) { ["x"]=> int(4) ["y"]=> int(5) ["z"]=> int(6) }

上面的例子中,由於$value=&$arr1['c']關係的存在,在將$arr2的每個元素賦值給$value的過程中,$arr1['c']的值都會改變,最終值為6

        解決上述問題的方法就是在完成迴圈之後刪除$value變數:unset($value)