php的循环与引用的一个问题

$arr = array(
    'a'=> 'a11',
    'b'=> 'b22',
    'c'=> 'c33',
);  
foreach ($arr as $k=>&$v){
    // Do somethind
}
foreach ($arr as $k=>$v){
    var_dump($v);
	}

这样的代码, var_dump 会输出:

string(3) "a11"
string(3) "b22"
string(3) "b22"
结果里, 第三行变成了 key='b' 的value.  问题就出在第一个循环的引用。

今天就踩到了一个这样的坑, 查问题用了很久.  简单来说,  foreach循环使用的引用,  循环结束后有所保留. php.net 着重写了:

Warning  Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().     

对于上面这个例子,  第一个循环结束后, $v引用仍然存在.  由于两个循环的变量命名一致,  第二个循环开始, $v 每次都会被赋值. 直到最后, $v 被设置成了  前一个元素的值.  原理很简单,  文档写的明明白白.  但如果工作中遇到相关的bug是很坑的,  定位需要很久.  

还得需要写码的时候就注意:

1. 减少引用的使用

2. 如果需要在foreah使用引用,  应该用函数将封装起来

欢迎分享,(木庄网络博客交流QQ群:562366239

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论