不确定这是否被视为错误
$array = ['numbers' => [1, 2, 3]];
foreach ($array as &$numbers) {
$numbers = [4, 5, 6];
}
var_dump($array);
modify_array($array);
var_dump($array);
function modify_array($array_arg)
{
$array_arg['numbers'] = [1, 2, 3];
}
打印
array(1) {
["numbers"]=>
&array(3) {
[0]=>
int(4)
[1]=>
int(5)
[2]=>
int(6)
}
}
array(1) {
["numbers"]=>
&array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
}
请注意,$ array未通过引用传递给modify_array(),但嵌套数组已被修改。这听起来合乎逻辑,但不确定这是否有记录!
答案 0 :(得分:4)
如果您使用foreah作为参考,则阻止PHP复制数组,因此您正在使用原始数组。当你完成foreach循环时,你应该在循环中使用unset()
变量,因为它仍然保留在内存中。如果你不这样做,你会得到不可预测的结果,就像你提出的问题一样。即使在documentation,您也会收到警告:
警告 $ value 的引用,即使在 foreach 循环之后,最后一个数组元素仍然存在。建议将其销毁 未设置()
Here你可以找到非常好的foreach循环示例,而不会失去设置。
因此,如果你添加unset()
,一切看起来都应该
$array = ['numbers' => [1, 2, 3]];
foreach ($array as &$numbers) {
$numbers = [4, 5, 6];
}
unset($numbers);
var_dump($array);
modify_array($array);
var_dump($array);
function modify_array($array_arg) {
$array_arg['numbers'] = [1, 2, 3];
}
结果:
array(1) { ["numbers"]=> array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) } }
array(1) { ["numbers"]=> array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) } }
答案 1 :(得分:0)
如果您重写以下代码:
foreach ($array as &$numbers) {
$numbers = [4, 5, 6];
}
要像这样:
$array['numbers'] = &$array['numbers'];
$array['numbers'] = [4,5,6];
更容易理解这种行为,这似乎是一个已知问题。 (见:http://php.net/manual/en/language.references.php#87532)