foreach循环后留下悬挂指针

发布者:梦幻一新科技 发布时间:2015-11-21 23:45:35 阅读次数:5261

在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法:

$arr = array(1, 2, 3, 4); 
foreach ($arr as &$value) {
    $value
= $value * 2;
}
// $arr is now array(2, 4, 6, 8)

这里有个问题很多人会迷糊。循环结束后,$value并未销毁,$value其实是数组中最后一个元素的引用,这样在后续对$value的使用中,如果不知道这一点,会引发一些莫名奇妙的错误:)看看下面这段代码:

$array = [1, 2, 3]; 
echo implode
(',', $array), "n";

foreach ($array as &$value) {}    // by reference
echo implode
(',', $array), "n";

foreach ($array as $value) {}     // by value (i.e., copy)
echo implode
(',', $array), "n";

上面代码的运行结果如下:

1,2,3 
1,2,3
1,2,2

你猜对了吗?为什么是这个结果呢?

我们来分析下。第一个循环过后,$value是数组中最后一个元素的引用。第二个循环开始:

  • 第一步:复制$arr[0]到$value(注意此时$value是$arr[2]的引用),这时数组变成[1,2,1]
  • 第二步:复制$arr[1]到$value,这时数组变成[1,2,2]
  • 第三步:复制$arr[2]到$value,这时数组变成[1,2,2]

综上,最终结果就是1,2,2

 

避免这种错误最好的办法就是在有指针引用(&value)的循环后立即用unset($value)进行变量:

$arr = array(1, 2, 3, 4); 
foreach ($arr as &$value) {
    $value
= $value * 2;
}
unset
($value);   // $value no longer references $arr[3]
喜欢
(0)
0%
一般
(0)
0%