两个foreach在相同的范围内具有相同的变量名称(并且第一个使用引用)

时间:2014-07-15 15:05:33

标签: php arrays foreach

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

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

E.g。

$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循环的“item属性”名称(例如$ 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;
}

1 个答案:

答案 0 :(得分:3)

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