1

当我写一些代码时,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+

谁能向我解释为什么?

4

2 回答 2

3

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

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

Ps(感谢@billyonecan 的说法):您需要unset($entry)首先,以便您的参考被破坏。

于 2013-05-02T16:35:29.080 回答
0

这在foreach的文档中特别提到。unset当它通过引用获取数组的元素时,您应该使用循环变量。

警告

即使在 foreach 循环之后,对 $value 和最后一个数组元素的引用仍然存在。建议通过 unset() 将其销毁。

于 2013-05-03T06:57:04.020 回答