【问题标题】:Strange foreach loop after modifying array修改数组后奇怪的foreach循环
【发布时间】:2013-04-26 22:20:20
【问题描述】:

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

谁能解释一下为什么?

【问题讨论】:

    标签: php loops foreach pass-by-reference


    【解决方案1】:

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

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

    附: (感谢@billyonecan 这么说):你需要先unset($entry),这样你的引用就会被销毁。

    【讨论】:

    【解决方案2】:

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

    警告

    $value 的引用和最后一个数组元素即使在 foreach 循环。建议通过 unset() 销毁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      相关资源
      最近更新 更多