php - 在 PHP 中将引用添加到数组会创建一个引用数组

标签 php arrays pointers foreach 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];
}

打印

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/

相关文章:

php - 从两个以上的表中获取数据时,我应该一直使用 LEFT JOIN 吗?

php - 在PHP中将当前日期添加到mysql数据库

c++ - 如何在另一个字符串的x位置插入一个字符串?

c++ - C++中数组的动态调整大小

c++ - 如果我在不删除第一个内存的情况下使用指针创建新内存会发生什么

php - 为什么这段代码具有很高的圈复杂度 - 或者它是 Jenkins 中 PHPMD 中的一个错误?

php - 我如何从年月 2019-03 减去一个月

arrays - 深拷贝一个数组

java - 为什么我的数组被覆盖了java

c++ - 错误: ‘void*’ is not a pointer-to-object type error while dynamically opening multiple shared libraries