不确定这是否被认为是一个错误
$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(),而是修改了嵌套数组。这听起来合乎逻辑,但不确定是否记录在案!
最佳答案
如果您使用带有引用的 foreah,您将阻止 PHP 复制数组,因此您正在处理原始数组。当你完成 foreach 循环时,你应该 unset()
变量在循环中使用,因为它仍然保留在内存中。如果你不这样做,你将得到不可预知的结果,就像你的问题中提出的那样。即使在 documentation你有一个警告:
Warning Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().
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) } }
关于php - 在 PHP 中将引用添加到数组会创建一个引用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25901853/