在寫代碼時發現php foreach引用賦值會導致意外的行為。
代碼示例:
<?php
$arr = array('a','b','c');
foreach($arr as $k=>&$v)
{
}
print_r($arr);
foreach($arr as $k=>$v)
{
}
print_r($arr);
?>
輸出結果:
Array ( [0] => a [1] => b [2] => c ) Array ( [0] => a [1] => b [2] => b )
經過查找資料,找到原因。其實,第一個foreach結束後,數組$arr最後一個元素$v的引用仍然保留。在進行第二個foreach循環時,實際上是對數組$arr的第三個元素的三次賦第二個foreach開始執行時,每次數組$arr的變化如下:
第一次: Array ( [0] => a [1] => b [2] => a )
第二次: Array ( [0] => a [1] => b [2] => b )
第三次: Array ( [0] => a [1] => b [2] => b )
所以會有最後的輸出結果。
為了避免這種情況,可以在第一個foreach結束後,取消掉引用:unset($v)。但是,為了避免不可預期的結果出現,慎用foreach引用賦值。