上代码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. 问题就出在第一个循环的引用.oop
今天就踩到了一个这样的坑, 查问题用了好久. 简单来讲, foreach循环使用的引用, 循环结束后有所保留. php.net 着重写了:spa
Warning.net
Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().code
对于上面这个例子, 第一个循环结束后, $v引用仍然存在. 因为两个循环的变量命名一致, 第二个循环开始, $v 每次都会被赋值. 直到最后, $v 被设置成了blog
前一个元素的值.element
原理很简单, 文档写的明明白白. 但若是工做中遇到相关的bug是很坑的, 定位须要好久. 还得须要写码的时候就注意:rem
1. 减小引用的使用文档
2. 若是须要在foreah使用引用, 应该用函数将封装起来