将PHP中的引用添加到数组中会创建一个引用数组

不知道这是否被认为是一个错误

$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()变量,因为它仍然保留在内存中。 如果你不这样做,你会得到不可预知的结果,就像你在这个问题中提出的那样。 即使在文档中,您也有一个警告:

警告即使在foreach循环之后,引用$ value和最后一个数组元素仍然存在。 建议通过unset()销毁它。

在这里您可以找到非常好的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) } }

如果您重写以下代码:

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)

链接地址: http://www.djcxy.com/p/81473.html

上一篇: Adding references in PHP to an array creates an array of references

下一篇: Type hierarchy only from JDK