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

Gad*_*eem 7 php arrays foreach pointers reference

不确定这是否被视为错误

$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];
}
Run Code Online (Sandbox Code Playgroud)

打印

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,$ array未通过引用传递给modify_array(),但嵌套数组已被修改.这听起来合乎逻辑,但不确定是否记录在案!

mar*_*an0 4

如果您将 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];
}
Run Code Online (Sandbox Code Playgroud)

结果:

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) } }
Run Code Online (Sandbox Code Playgroud)

  • “如果你不这样做,你将得到不可预测的结果”——什么告诉我们结果一定是“不可预测的”?您引用的警告并未解释该行为。 (2认同)