我试图在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
的参考文献被严重破坏的事实,并忘记它们的存在,你会帮自己一个忙。