foreach 透過 &$value 以引用方式遍歷陣列,可直接修改元素值。但若在循環結束後未釋放引用,後續復用同一變量名會導致不可預期的數據污染。
<?php
$arr = array('a','b','c');
$arr2 = array('d','e','f');
foreach ($arr as &$value) {
$value .= '4';
}
// 此時 $value 仍引用 $arr[2]
foreach ($arr2 as $value) { // 無 & 符號,但 $value 仍是引用
// $value 隨 $arr2 元素變化,$arr[2] 同步被修改
}
foreach ($arr as $value) {
echo $value, "\n";
}
?>
輸出結果:
a4
b4
b4
預期應為 a4、b4、c4,實際卻出現重複的 b4。
foreach 結束後,$value 仍保持對 $arr[2] 的引用。foreach 雖未使用引用,但 PHP 復用了同一變量符號 $value,導致 $arr[2] 隨著 $arr2 遍歷而被依次覆寫為 d、e、f。foreach 讀取 $arr 時,$arr[2] 已變為 f;遍歷過程中 $value 再次綁定陣列元素,導致 $arr[2] 再次被修改為 b4。在引用循環結束後立即銷毀引用變量:
foreach ($arr as &$value) {
$value .= '4';
}
unset($value); // 斷開引用關係,後續復用 $value 安全
foreach (&$var) 結束後寫上 unset($var)。