$arr = [1, 2, 3];
foreach ($arr as &$v) { $v *= 2; }
unset($v);
foreach ($arr as $v) { echo $v; }

用引用遍历数组做批量修改,后面的循环复用同一个变量名,结果最后一条数据覆盖了前面所有元素。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:foreach 的引用变量在循环结束后仍指向最后一个元素,再次赋值就改写了它。

这次卡住的地方就在「PHP foreach 引用残留」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:循环体内用完立即 unset;或改用下标访问赋值;避免同名变量复用。

确认没问题再收工,第二层循环输出与数组实际内容一致,不再出现整体被覆盖的情况。

作者 9823189