php 解决循环引用,php 循环引用

昨天遇到了一个引用的问题

ec1070d17b4186da4cbe57cd27bb867f.png

结果是什么,第一时间我也是想当然的回答为[1,2,3]

但是实际的结果却让我大跌眼镜 正确的结果为[2,3,3]

822d63b458bf5c71342717f38f33de52.png

经过我一番思考和讨论 我大概分析了其运行的流程和为什么会是[2,3,3]这个结果

首先这个引用是两个或多个变量指向同一个内存地址如下图

d9a9212c259e2d7a14618e9020dccb06.png

$a = 5;

$b = &$a;

这样他们便指向同一个内存地址不管你改变$a还是$b得值,另外一个值都会跟着改变

现在让我回到那个循环

$arr = [1,2,3];

foreach ($arr as $key => $value) {

$value = &$arr[$key];

print_r($arr);

}

从代码可以看出$value指向了数组中每个元素得地址,如果$value得值发生了变化即数组中得值也会变化

第一次循环

$keyt=0 $value = 1 1 = $arr[0] 此时$value这个变量已经指向了$arr数组中第一个元素得位置就是1得内存位置

所以当一次循环结束打印得数组为

f792fbd5967adde065987cf71df2093b.png

第二次循环

这是重点,因为第一次循环$value这个变量已经指向了$arr数组中第一个元素得位置就是1得内存位置,当第二循环刚刚开始,还没有运行到$value = &$arr[$key];这行,此时第二次循环已经把 $value得值变为了2,因为第一次循环 $value指向数组$arr元素1的位置,所以当第二次循环刚开始$value得值变为了2,所以$arr中第一元素就变为2,继续往下运行到$value = &$arr[$key]; 2 = &$arr[1]此时$value指向得地址就变为$arr第二个元素得内存位置,同时把第二个元素赋值为2

f6a4b34bea8b04c4aa402bbfcfeff42a.png

第三次循环$value已经指向了数组$arr第二个元素得位置,所以循环刚开始$value得值就被赋值了3,即数组得第二个元素是3,此时再往下运行$value = &$arr[$key]; 3= &$arr[2] 素组得第三个元素还是3,$value指向数组得第三个元素得位置

bd723c63bab7998d2ca1ee28f8ef6f95.png

到此整个数组循环结束结果就是[2,3,3] 同理如果数组再加一个4必然回事[2,3,4,4]

总结

当第一次循环结束时,建立多对一得内存地址映射,以后得每次循环都会先改变$value对应内存地址得值,即数组元素得值,然后$value再指向数组下一个元素得内存地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值