foreach中使用引用传参造成的错误

博客围绕PHP代码中数据上传时最后一条数据被覆盖的问题展开。经排查,是因对同一数据多次foreach时,引用传参使用不当造成。原理是引用传参使变量指向原变量地址,导致后续操作影响数组最后一个参数。给出销毁引用变量、统一用引用传参、改用$data[$key]形式等解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

foreach中使用引用传参造成的错误

背景

同事写的代码,上传数据的时候,总是会最后一条数据被上一条数据覆盖掉,导致倒数第二条数据出现两次,最后一条数据丢失

发现问题

经排查,是对同一数据进行多次foreach时,有时用的引用传参,有时没有用引用传参造成的,复现问题如下:

$test_array = array(
    'one' => '小明',
    'two' => '小张',
    'three' => '小刚',
);
foreach ($test_array as &$item) {
}
foreach ($test_array as $item) {
}
var_dump($test_array);die;

上述代码,循环中并没有对数组进行任何操作,输出结果为
在这里插入图片描述
与预期结果严重不符

原理分析

出现这个问题的原因的引用传参的使用,引用传参的使用方法是,使当前的变量只是对原变量的地址的引用,而不是内容的引用。
所以当第一个foreach使用引用传参时,循环结束时,value这个参数的数据路径和数组中的最后一个参数路径是一样的,这时无论对value进行什么样的操作,都会浮现到数组的最后一个参数上,所以当第二次遍历时,value被循环赋值,导致数组的最后一个参数也被不停赋值,这里最后一个参数会保留之上的最后一个参数

解决方案

  1. 引用传参变量不使用后对变量进行销毁
  2. 以后每次遍历都使用引用传参(不安全)
  3. 尽量不要在遍历中使用引用传参,改用$data[$key]的形式进行修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael·Ren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值