foreach() 中用指针指向数组元素,循环结束后最好销毁指针

本文通过一个PHP实例,展示了在使用foreach循环处理数组时,如何因引用操作不当而导致数组元素意外修改的问题,并提供了解决方案。

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

之前发过一次微博,今天又遇到这个问题,并且再次犯错,于是决定再加深一下。

就举php.net里的一个例子吧

$a = array('abe','ben','cam');
foreach ($a as $k=>&$n){
    $n = strtoupper($n);
}
print_r($a);
foreach ($a as $k=>$n){ // notice NO reference here!
    echo "$n\n";
}
print_r($a);

输出的结果是:

Array
(
    [0] => ABE
    [1] => BEN
    [2] => CAM
)
ABE
BEN
BEN
Array
(
    [0] => ABE
    [1] => BEN
    [2] => BEN
)

可以看到第一次foreach()循环以后是正常的,第二次循环以后$a[2]从变成了'BEN',和$a[1]一样。

初看很纳闷,但是如果在第二个foreach()里print_r($a),就很容易明白了,结果如下:

Array
(
    [0] => ABE
    [1] => BEN
    [2] => ABE
)

Array
(
    [0] => ABE
    [1] => BEN
    [2] => BEN
)

Array
(
    [0] => ABE
    [1] => BEN
    [2] => BEN
)

由于第一个foreach()是用指针指向数组元素,所以循环结束后变量$n依然指向数组$a的最后一个元素,也就是$a[2]。

第二个foreach()里,第一次循环就将$a[0]的值'ABE'赋给$n,第二次又将$a[1]的值'BEN'赋给$n,其实这两次修改的都是$a[2]这个元素,第三次等于没有变化,所以$a[2]无辜地被修改了三次,导致最后的结果。

由此可见,如果foreach()中用指针指向数组元素,循环结束后最好销毁指针,以免后面再次用到重名的变量导致数组的值被无辜修改。

 

PS:之前的微博如下:

 

转载于:https://www.cnblogs.com/roving/p/3468110.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值