PHP添加对数组的引用


PHP Adding references to array

我试图在PHP中添加对数组的整数引用,但由于某些原因,它不起作用。我完全不明白为什么。

简单来说,代码是:

<?php
$myArray = array( 1 => true, 2 => true, 3 => true );
$param_ref = array();
foreach($myArray as $key => $value) {
    $param_ref[] = &$key;
}
var_dump($param_ref);
?>

我预计输出为:

array(3) { 
    [0] => &int(1) 
    [1] => &int(2) 
    [2] => &int(3) 
} 

但实际输出是:

array(3) { 
    [0] => &int(3) 
    [1] => &int(3) 
    [2] => &int(3) 
} 

经过仔细检查,数组的($param_ref)值似乎在循环的每次迭代中都被覆盖了。

知道发生了什么事吗?

$key在循环的每次迭代中都会发生变化,因此对$key的引用总是对$key的当前值的引用,CCD_3(在循环结束时)是三。。。。因此,对$key的所有三个引用都指向$key的唯一实例,该实例的值为3

考虑为:

迭代#1

6被分配值CCD_ 7;$param_ref[0]是对$key的引用,因此它指向值为1的变量。

迭代#2

$key现在具有值CCD_ 11;$param_ref[1]是对$key的引用,因此它指向值为2的变量。。。。但是$param_ref[0]也是对$key的引用,所以它指向一个现在值为2的变量

迭代#3

$key现在具有值3$param_ref[2]是对$key的引用,因此它指向值为3的变量。。。。但两个$param_ref[0]$param_ref[1]也引用了$key,所以它们指向的变量现在的值为3

你与PHP交战,PHP获胜。:-)

结果是,通过使用表达式&$key,PHP将$key指向的值视为引用。这反过来又导致对$key的重新分配(发生在循环的每次迭代中)通过过去任何时候被分配值&$key的所有变量都是可见的。

也就是说,在第一次迭代之后,得到的阵列是

array(1) { 
    [0] => &int(1) 
} 

第二次迭代后,阵列为

array(2) { 
    [0] => &int(2) 
    [1] => &int(2) 
} 

等等

如何获得预期结果:循环结束时只需unset($key)

foreach($myArray as $key => $value) {
    $param_ref[] = &$key;
    unset($key);
}

您的$param_ref值不会被覆盖,foreach通常就是这样工作的。也是foreach($foo as &$bar)问题的原因,如果你搜索,你可以阅读。问题是,当您执行= &$key;时,您不会创建对$key所指向的对象的引用,而是创建对$key值的引用。当该值更改时,对$key的所有引用也会更改。

无论如何,正如人们多次指出的那样,如果你接受PHP的参考文献被严重破坏的事实,并忘记它们的存在,你会帮自己一个忙。