noel0217 发表于 2018-12-11 13:55:04

php 循环引用

  昨天遇到了一个引用的问题
http://i2.运维网.com/images/blog/201806/24/cc79cfbf17b46c53221e47763c77465a.png
结果是什么,第一时间我也是想当然的回答为
  但是实际的结果却让我大跌眼镜 正确的结果为
http://i2.运维网.com/images/blog/201806/24/07823c7e2e529cf0cec1a14d520c7dd3.png
经过我一番思考和讨论 我大概分析了其运行的流程和为什么会是这个结果
首先这个引用是两个或多个变量指向同一个内存地址如下图
http://i2.运维网.com/images/blog/201806/24/00aaee96b7acb0e5d209d04a65b10e5d.png
$a = 5;
$b = &$a;
这样他们便指向同一个内存地址不管你改变$a还是$b得值,另外一个值都会跟着改变
现在让我回到那个循环
  $arr = ;
foreach ($arr as $key => $value) {
$value = &$arr[$key];
print_r($arr);
}
  从代码可以看出$value指向了数组中每个元素得地址,如果$value得值发生了变化即数组中得值也会变化
  第一次循环
$keyt=0$value = 1   1 = $arr此时$value这个变量已经指向了$arr数组中第一个元素得位置就是1得内存位置
所以当一次循环结束打印得数组为
http://i2.运维网.com/images/blog/201806/24/c98a36529b9ee0cb51f1adc4c62b5cf2.png
  第二次循环
这是重点,因为第一次循环$value这个变量已经指向了$arr数组中第一个元素得位置就是1得内存位置,当第二循环刚刚开始,还没有运行到$value = &$arr[$key];这行,此时第二次循环已经把 $value得值变为了2,因为第一次循环 $value指向数组$arr元素1的位置,所以当第二次循环刚开始$value得值变为了2,所以$arr中第一元素就变为2,继续往下运行到$value = &$arr[$key];2 = &$arr此时$value指向得地址就变为$arr第二个元素得内存位置,同时把第二个元素赋值为2
http://i2.运维网.com/images/blog/201806/24/54157bfac1a60f100d7614a29353530a.png
  第三次循环$value已经指向了数组$arr第二个元素得位置,所以循环刚开始$value得值就被赋值了3,即数组得第二个元素是3,此时再往下运行$value = &$arr[$key];3= &$arr 素组得第三个元素还是3,$value指向数组得第三个元素得位置
http://i2.运维网.com/images/blog/201806/24/7af26cd9e04d1b087bd0513ef069efe6.png
到此整个数组循环结束结果就是 同理如果数组再加一个4必然回事
  总结
当第一次循环结束时,建立多对一得内存地址映射,以后得每次循环都会先改变$value对应内存地址得值,即数组元素得值,然后$value再指向数组下一个元素得内存地址



页: [1]
查看完整版本: php 循环引用