PHP foreach使用 &引用 的坑

在PHP中,array是最常用的结构了,可以当做队列、堆栈、hash等结构使用,所以遍历array最常用的foreach循环,我们用得很多,但其实foreach循环中有一个隐藏的坑,如下代码:

<?php

$arr = [1,2,4];

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

print_r($arr);

foreach($arr as $a){
    print_r($a);
}

此时打印出$arr的结果是1、4、9

但第二个循环中打印出的结果是1、4、4

为什么会出现这个问题呢?

详见手册:http://php.net/manual/zh/control-structures.foreach.php

Warning
数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

而在foreach的实现里,每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步。

当我们在第一个foreach中以引用的方式使用元素,循环结束之后,$v 其实是数组最后一个元素的引用。

由于foreach不销毁最后一个元素,所以当第一个循环结束时,我们有了一个隐藏的变量 v arr 最后一个元素的引用。

而我们在第二个循环中继续以 v v指向的元素不断的被覆盖。从而使得第二个循环中,最后一次循环时得到的值和倒数第二次循环时相同。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值