PHP-foreach中引用缺陷

本文深入探讨了PHP中foreach循环使用引用时的潜在问题,解释了为何这会导致数组元素被意外修改,并提供了正确的解决方案。

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


近期使用php开发过程中,发现一个foreach中 引用的小坑。

1.现象

如下代码:

$arr = [1, 2, 4];

foreach ($arr as &$a) {
    $a = $a * $a;
}
print_r($arr);
foreach($arr as $a){
    print_r($a);
    print(" ");
}

打印结果:

Array
(
    [0] => 1
    [1] => 4
    [2] => 16
)
1 4 4 

2.原因

为什么在第一次遍历中使用引用后,第二次遍历最后一个元素结果异常?
问题解释官方参考中可以知道foreach“引用”后,数组中最后一个元素的引用仍会保留,需要手动删除,即应在第一次遍历后添加unset($a);

3.分析

打印如下:

$arr = [1, 2, 4];

foreach ($arr as &$a) {
    $a = $a * $a;
}
print_r($arr);
foreach($arr as $k=>$a){
    printf("----------------\n%d => %s\n", $k, $a);
    print_r($arr);
}

打印结果:

Array
(
    [0] => 1
    [1] => 4
    [2] => 16
)
------------
0 => 1
Array
(
    [0] => 1
    [1] => 4
    [2] => 1
)
------------
1 => 4
Array
(
    [0] => 1
    [1] => 4
    [2] => 4
)
------------
2 => 4
Array
(
    [0] => 1
    [1] => 4
    [2] => 4
)

由上可以理解,在第一次遍历foreach中使用引用后,$a仍然是数组的末尾元素的引用。第二次遍历foreach时,相当于一直在对末尾元素做“赋值”覆盖操作;当执行到最后一步时,末尾元素自己对自己覆盖,原本的值来源于上一次覆盖,即倒数第二个元素的值,所以最后一个元素输出异常。

参考文章:PHP foreach使用 &引用 的坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值