【问题标题】:Two foreach in the same scope with the same variable names (and the first one using a reference)两个 foreach 在同一范围内具有相同的变量名(第一个使用引用)
【发布时间】:2014-07-15 23:16:23
【问题描述】:

我在 PHP 中的 foreach 循环中遇到了一个非常有趣的问题。我在一个范围内声明了一个数组和两个(非常相似的)foreach 循环。

有趣的是,如果第二个 foreach 使用与第一个相同的变量名并且(同时)第一个使用引用(对数组项),则第二个 foreach 无法正常工作。

例如

$my_array = array("one", "two", "three", "four");
foreach($my_array as &$my_item) {

}

foreach($my_array as $my_item) {
  $second_array[] = $my_item;
}

那么$second_array数组不包含"one", "two", "three", "four"但实际上是"one", "two", "three", "three"

有人可以向我解释这是为什么吗?因为我真的不知道,这两个变量应该有不同的范围,当不使用引用时它工作得很好......

//修复非常简单,除了将两个 foreach 循环合并为一个之外,它还有助于更改其中一个 foreach 循环的“项目属性”名称(例如 $my_item_1)。问题是,我不想修复它,我想理解它:)。

编辑: 这很好用。

$my_array = array("one", "two", "three", "four");
foreach($my_array as $my_item) {

}

foreach($my_array as $my_item) {
  $second_array[] = $my_item;
}

这也很好用。

$my_array = array("one", "two", "three", "four");
foreach($my_array as &$my_item) {

}

foreach($my_array as $my_item_1) {
  $second_array[] = $my_item_1;
}

【问题讨论】:

  • 您能否为第一个循环填写正文,以便我们看到它在做什么?你在那个循环中修改$my_item吗?
  • 它可以像我写的那样工作(例如,不像人们期望的那样),即使是空体(例如,示例按照帖子中的描述工作(我已经测试过))。

标签: php arrays foreach


【解决方案1】:

foreach()手册页中有解释:

警告

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

$my_array = array("one", "two", "three", "four");
foreach($my_array as &$my_item) {

}
unset($my_item);  //unset()

foreach($my_array as $my_item) {
  $second_array[] = $my_item;
}

这是一个非常好的答案:How 'foreach' actually works

【讨论】:

  • 谢谢!我认为 $value 仅在它所属的 foreach 的内部范围内声明... PHP 肯定是一门有趣的语言。
猜你喜欢
  • 1970-01-01
  • 2018-01-10
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2015-11-22
  • 2018-09-17
  • 2011-08-31
相关资源
最近更新 更多