我正在尝试在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)值在循环的每次迭代中被覆盖。
知道发生了什么事吗?
答案 0 :(得分:1)
$key
每次迭代都会被更改,因此您对$key
的引用始终是对$key
的当前值的引用,({循环)是三....所以对$key
的所有三个引用都指向$ key的唯一实例,其值为3
考虑为:
迭代#1
$key
被赋值1
; $param_ref[0]
是对$key
的引用,因此它指向的值为1
的变量。
迭代#2
$ key现在的值为2
,; $param_ref[1]
是对$key
的引用,因此它指向的值为2
的变量....但$param_ref[0]
也是$key
的引用{1}},因此它指向的变量现在的值为2
迭代#3
$ key现在的值为3
,; $param_ref[2]
是对$key
的引用,因此它指向的值为3
的变量....但$param_ref[0]
$param_ref[1]
也引用$key
,因此他们指向的变量现在的值为3
答案 1 :(得分:1)
你和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);
}
答案 2 :(得分:0)
$param_ref
您的foreach
值未被覆盖,foreach($foo as &$bar)
一般如何运作。也是引起讨论的= &$key;
问题的原因,如果您搜索,可以阅读。问题是,当您执行$key
时,您不会创建对$key
指向的内容的引用,您创建对$key
值的引用。当此值发生变化时,对PHP
的所有引用也会发生变化。
无论如何,正如已经多次指出的那样,如果你接受{{1}}的引用被严重破坏的事实,你就会自己帮忙,只是忘记了它们的存在。