在php foreach中使用引用传值的一个问题


很久以来我都习惯在php的foreach中使用引用,来操作数组中的单元,今天在调试程序的时候发现一个问题,还不知道是不是属于bug。在完成程序功能以后我进行了简单的测试。发现以下规律:

  1. 一直保持使用一种传值方式(值传递或者引用传递)不会出现问题。
  2. 如果使用引用传递再使用值传递,遍历结果的最后一个元素总是与倒数第二个结果一样。
  3. 使用引用操作后如果不确定后面是否会使用值传递,在循环结束后使用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,',';
}

Archives