foreach (array as $value) statement
foreach (array as $key => $value) statement
僅能遍歷陣列或物件,用於其他型別或未初始化變數會報錯。
$arr = [0,1,2,3,4,5];
$arr = &$arr; // $arr 成為參考
foreach($arr as $value){
$arr = []; // 清空原陣列
echo $value; // 僅輸出 0
}
原因:迴圈使用的陣列直接指向原資料而非複製。若 $value 也是參考(foreach($arr as &$value)),同樣會受影響。
若
$arr為global變數,隱含參考行為,結果相同。
foreach($arr as &$value){ /* ... */ }
foreach($arr as $value){ /* 第二次迴圈 $value 仍是參考,導致邏輯錯誤 */ }
解決方案:
// 方案 1:unset 釋放參考
foreach($arr as &$value){ }
unset($value);
foreach($arr as $value){ }
// 方案 2:兩次皆用參考
foreach($arr as &$value){ }
foreach($arr as &$value){ }
// 方案 3:複製陣列
foreach($arr as &$value){ }
$arr2 = $arr;
foreach($arr2 as $value){ }
foreach((array)$arr as $value) { } // 強制轉型,即使 $arr 為 null 也不會錯
foreach($arr as $value)),除非確實需要修改原陣列元素。&$value),迴圈結束後立即 unset($value)。(array) 防禦性轉型。array_walk、array_map 等函式風格,語意更清晰。foreach 是 PHP 最常用的迴圈結構,理解其參考語意與複製行為對寫出正確、可維護的代碼至關重要。養成「用完參考即 unset」習慣,能避免 90% 相關 Bug。