NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
| PHP 数组 foreach引用导致的bug | | | --- | --- | ``` <?php $arr = array('a', 'b', 'c'); foreach($arr as &$v) {} foreach($arr as $v) {} var_dump($arr); /* 结果为: array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> &string(1) "b" } */ //第一个foreach用引用赋值的方式将数组的值依次赋给了$v。 $arr = array('a', 'b', 'c'); foreach($arr as &$v) {} var_dump($v); //此时的$v的值为c,是引用赋值,$v指向了字符串c的地址空间。 //第二个foreach是以拷贝赋值的方式将数组的值依次赋值给了$v。 //由于目前$v指向了c的地址空间,那么改变$v的值即改变了c所占地址空间的值。 $arr = array('a', 'b', 'c'); foreach($arr as &$v) {} foreach($arr as $v) { var_dump($arr); break; } //第一次赋值将a赋值到了$v,原有c所占的地址空间的值变为了a,此时数组就是array('a', 'b', 'a')。 //以此类推第一次赋值c->a,第二次赋值即a->b,第三次赋值即b->b, //所以最终结果为array('a', 'b', 'b')。 // foreach 遍历三次 // 第一次数组为 ['a', 'b', 'b'],此时c的空间位置被$v='a'覆盖 // 第二次数组为 ['a', 'b', 'b'],此时c的空间位置被$v='b'覆盖 // 第一次数组为 ['a', 'b', 'b'],最后一次遍历因为此时c的空间位置已经被$v='b'覆盖 ``` >这个问题是这样的  foreach本身是一个赋值的过程, 第一次foreach结束的时候 $value和$arr\[2\] 两个变量都指向了$arr\[2\],  第二次foreach的时候 每次foreach本质上是一次赋值行为, 也就是 $value = $arr\[0\];  这样就把$arr\[2\] 赋成$arr\[0\]了  同理 第二次的时候$arr\[2\] = $arr\[1\]  导致 $arr\[2\]每次循环的时候都会被重新赋值