首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP foreach 引用遍歷深度解析:&$value 修改原數組的機制與陷阱

     編輯:PHP 綜合知識

PHP 5 引入引用遍歷語法 foreach ($arr as &$value),允許直接修改原數組元素,避免了傳統按值拷貝的性能開銷與後續重新賦值的麻煩。

基本用法

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr 變為 array(2, 4, 6, 8)
?>

核心限制:被遍歷變量必須可引用

<?php
// ❌ 錯誤:臨時數組表達式不可引用
foreach (array(1, 2, 3, 4) as &$value) {
    $value = $value * 2;
}
// Fatal error: Cannot create references to elements of a temporary array expression

// ✅ 正確:先賦值給變量
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) { ... }

底層機制

  • 按值遍歷(默認):操作數組拷貝,原數組不變
  • 引用遍歷(&$value):直接操作原數組內存地址

經典陷阱:循環後的殘留引用

$arr = [1, 2, 3];
foreach ($arr as &$v) { $v *= 2; }
foreach ($arr as $v) { echo $v; }  // 輸出 2 4 4 而非 2 4 6!

// 原因:$v 仍引用著 $arr[2],第二輪循環將 $arr[2] 覆蓋為 $arr[1] 的值

// 解決:循環後銷毀引用
unset($v);

最佳實踐建議

  1. 僅在需要修改原數組時使用引用遍歷
  2. 循環結束後立即 unset($value) 釋放引用
  3. 只讀遍歷堅持使用按值模式
  4. PHP 7+ 中 foreach 不再影響內部指針,行為更可預測
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved