PHP中foreach加&可直接修改原数组元素,但需在循环后unset引用变量,否则会意外影响后续操作;多维数组需逐层加&并unset,或用键索引引用;&必须紧贴$value,不可放在$key前。

foreach 中用 & 引用修改数组元素
PHP 的 foreach 默认是值拷贝,想在遍历时直接修改原数组,必须显式加引用符号 &。不加的话,循环体内对变量的赋值不会影响原数组。
- 写法:
foreach ($arr as &$value) { $value = ...; } - 必须在循环结束后调用
unset($value),否则该引用会保留,可能意外修改后续同名变量或下一次循环的最后一个元素 - 如果数组本身是引用(比如来自函数返回的引用),
&$value仍有效,但要注意嵌套引用带来的副作用 - 不能对表达式取引用,例如
foreach ($arr as &($item->prop))语法错误
遍历多维数组并修改深层值
要修改嵌套数组中的某个字段(比如所有子数组的 status),一层 &$value 不够,得逐层解引用。
- 二维示例:
foreach ($data as &$row) { foreach ($row as &$cell) { $cell = trim($cell); } unset($cell); } unset($row); - 漏掉任一层
unset都可能导致后续赋值污染——比如第二次遍历时$row还绑着上一轮最后一个$row,一改全改 - 更安全的做法是用键索引配合引用:
foreach ($data as $k => &$row) { $data[$k]['updated'] = true; },避免依赖循环变量名
foreach 引用和 key-value 同时使用
需要同时访问键和引用值时,语法是 foreach ($arr as $key => &$value),顺序不能颠倒;& 必须紧贴 $value,不能写成 foreach ($arr as &$key => $value)(这会报错)。
- 错误写法:
foreach ($arr as &$k => $v)→ Parse error: syntax error - 正确写法:
foreach ($arr as $k => &$v),然后可操作$arr[$k]或直接改$v - 如果数组键是字符串且含特殊字符(如中划线、点),引用依然生效,但注意键本身不可被
&$v修改
替代方案:用 for 或引用传参绕过 foreach 限制
当 foreach 加引用变得难维护(比如动态嵌套、条件跳过),不如退一步用传统 for 或封装函数。
立即学习“PHP免费学习笔记(深入)”;
for ($i = 0; $i —— 简单直接,无引用残留风险- 函数内修改:定义
function updateItems(array &$list) { foreach ($list as &$item) { $item['done'] = true; } },调用时传入变量本身(如updateItems($myArray)) - 注意:
foreach ($arr as $v)+$arr[$k] = ...在大数组中性能略差,因为每次都要查键;而&$v是原地指针,更快
引用遍历真正容易出问题的地方不在语法,而在生命周期管理——unset 漏写、循环嵌套时变量名复用、或者把引用数组传给其他函数后意外修改。实际项目里,宁可多写两行 for 或明确键操作,也别让引用状态飘在看不见的地方。



















