2014-07-15 44 views
1

我已经介入了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 property'名称(例如$ 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

你可以填写第一个循环的身体,这样我们可以看到它在做什么?你在那个循环中修改'$ my_item'吗? –

+0

即使是空的身体,它也可以像我写的一样工作(例如,不像人们所期望的那样)(例如,这些示例的工作方式与帖子中描述的一样(我已经测试过))。 – Petrroll

回答

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

+0

谢谢!我认为$ value只是在它所属的foreach的内部范围内声明的...... PHP肯定是一种有趣的语言。 – Petrroll

相关问题