【问题标题】:foreach and reference [duplicate]foreach 和参考 [重复]
【发布时间】:2012-07-24 07:24:34
【问题描述】:

可能重复:
Strange behavior Of foreach
Strange behaviour after loop by reference - Is this a PHP bug?

我确实对 Foreach 有问题,我无法理解第二个 foreach。

为什么 $foo 数组的第三部分的值是 'two'!

据我们所知,如果我们删除 '&'(在第一个 foreach 中),问题就会解决,但为什么呢?

<?php

$foo = array('one', 'two', 'three');

foreach ($foo as &$bar)
{
// no-op
}

var_dump($foo);

foreach ($foo as $bar)
{
 // no-op
}

var_dump($foo);
?>
###############################################

产生:

 array(3) {
   [0]=>string(3) "one"
   [1]=>string(3) "two"
   [2]=>&string(5) "three"
  }
   array(3) {
  [0]=>string(3) "one"
  [1]=>string(3) "two"
  [2]=>&string(3) "two"
  } 

【问题讨论】:

  • 第二个 foreach 基本上是:foreach ($foo as $foo[2])。所以每次迭代,你都在用当前元素更新 $foo 的最后一个元素。而且由于最后一个元素丢失了,你最终会在最后一个位置上获得倒数第二个。

标签: php reference foreach


【解决方案1】:

来自the docs

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

所以在你的情况下:

<?php

$foo = array('one', 'two', 'three');

foreach ($foo as &$bar)
{
    // no-op
}

var_dump($foo);

unset($bar);

foreach ($foo as $bar)
{
 // no-op
}

var_dump($foo);
?>

【讨论】:

  • 我会称这是一个错误,没想到它会被记录在案。在测试时,我还发现循环之间的unset 确实可以解决问题。
  • 谢谢,我知道我们可以使用 unset。但是我不明白为什么'&'会改变数组的值?!
  • 所以这是一个错误。谢谢。
  • @wandad 不,这不是错误。这是预期的行为。
【解决方案2】:

在第一个 foreach 中,您使用的是带有 '&' 符号的引用,因此实际上修改了值。我不知道第一个 foreach 里面是什么,但你正在覆盖旧值,这就是为什么你的第二个 foreach 值与开始时不同。

编辑这个post有一个简洁的答案,或者只是按照建议使用unset

【讨论】:

  • 您是否尝试过运行问题中的代码?它产生该输出,并且没有(明显的)覆盖,只有两个 foreach 循环。
猜你喜欢
  • 1970-01-01
  • 2012-03-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2011-01-21
  • 2015-08-06
相关资源
最近更新 更多