很久以来我都习惯在php的foreach中使用引用,来操作数组中的单元,今天在调试程序的时候发现一个问题,还不知道是不是属于bug。在完成程序功能以后我进行了简单的测试。发现以下规律:
- 一直保持使用一种传值方式(值传递或者引用传递)不会出现问题。
- 如果使用引用传递再使用值传递,遍历结果的最后一个元素总是与倒数第二个结果一样。
- 使用引用操作后如果不确定后面是否会使用值传递,在循环结束后使用unset取消foreach中引用变量的引用也可以解决这个问题。
下面是我的测试代码:
$arr = array(); for($i=1;$i<=10;$i++){ $arr[]=$i; } //继续用引用方式传递不存在问题 foreach ($arr as &$v){ echo $v,','; $v = 'n'.$v; } echo "<br>\n"; //如果不小心改用值传递最后一个元素的结果就会出错 foreach ($arr as &$v){ echo $v,','; } echo "<br>\n"; foreach ($arr as $v){ echo $v,','; } echo "<br><br><br>\n\n\n"; $arr = array(); for($i=1;$i<=10;$i++){ $arr[]=$i; } foreach ($arr as &$v){ echo $v,','; $v = 'n'.$v; } unset($v); echo "<br>\n"; //前面用引用操作后,删除$v的引用,再使用值传递就没有问题了 foreach ($arr as $v){ echo $v,','; }