当我写了一些代码时,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+
one+
one+
任何人都可以向我解释原因吗?
答案 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()来销毁它。