我在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;
}
答案 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。