php foreach引用遍历必须写成foreach($arr as $key => &$value),$value前加&,$key不可加&;循环后须unset($value),否则最后一元素被意外覆盖;替代方案是用键名直接赋值,更安全。

PHP foreach 引用遍历的正确写法
必须在 $value 前加 &,且 $key 不能加引用符号;否则修改的是副本,原数组不变。
-
foreach ($arr as $key => &$value)是标准写法,$value是原数组元素的引用 - 漏掉
&就是普通遍历,所有赋值操作都无效 - 如果用了
&$value但后续还继续用这个变量(比如二次遍历),记得unset($value),否则可能意外污染下一个循环的最后一个元素
为什么 foreach 引用后数组最后一个元素会“被改两次”
这是 PHP 引用机制和循环变量复用共同导致的经典陷阱:循环结束后,$value 仍指向原数组最后一项,若之后再给 $value 赋值,最后一项会被覆盖。
- 常见现象:
var_dump($arr)发现末尾元素值异常,比如变成null或上一轮的某个值 - 触发条件:使用了
&$value,且循环结束后没有unset($value) - 修复方式:循环结束后立刻执行
unset($value),不是可选项,是必须项
替代方案:直接用键名修改,避开引用风险
如果你只是想批量更新数组值,不一定要用引用;用键索引直接赋值更安全、语义更清晰。
-
foreach ($arr as $key => $value) { $arr[$key] = $value * 2; }—— 无引用,无副作用 - 适用于简单映射类操作,性能差异可忽略(PHP 7.4+ 对
$arr[$key]访问做了优化) - 避免了
unset忘记、嵌套循环中变量冲突等问题
foreach 引用在多维数组里怎么安全使用
对二维数组某一层做引用遍历时,只对目标层级加 &,深层结构需单独判断是否需要引用,否则容易引发不可预期的内存共享。
- 想修改子数组的值:用
foreach ($arr as &$sub),再对$sub内部用键赋值或再次引用 - 错误写法:
foreach ($arr as &$sub) { foreach ($sub as &$item) { ... } }—— 忘记unset($item)和unset($sub),两层残留引用会互相干扰 - 更稳妥做法:外层用引用,内层用键赋值,例如
$sub[$i] = ...
实际写的时候,能不用引用就不用;非用不可时,unset 那一行别省,它不在文档里显眼位置,但真出问题时,八成卡在这儿。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











