修改数组后奇怪的foreach循环

时间:2013-05-02 16:32:08

标签: php loops foreach pass-by-reference

当我写了一些代码时,PHP让我感到困惑,因为我没想到以下代码的结果:

$data = array(array('test' => 'one'), array('test' => 'two'));

foreach($data as &$entry) {
    $entry['test'] .= '+';
}

foreach($data as $entry) {
    echo $entry['test']."\n";
}

我认为应该输出

one+
two+

但结果是:http://ideone.com/e5tCsi

one+
one+

任何人都可以向我解释原因吗?

2 个答案:

答案 0 :(得分:3)

这是预期的行为,另请参阅https://bugs.php.net/bug.php?id=29992

使用第二个foreach时会保留引用,因此在使用第二个foreach时,$entry的值(仍指向$data[1])将被第一个值覆盖。

P.S。 (感谢@billyonecan的说法):你需要先unset($entry),以便你的参考被销毁。

答案 1 :(得分:0)

documentation for foreach中特别提到了这一点。当通过引用获取数组的元素时,你应该unset循环变量。

  

警告

     

$ value的引用和最后一个数组元素仍然保留在   foreach循环。建议通过unset()来销毁它。