PHP添加对数组的引用

时间:2014-09-06 13:33:49

标签: php arrays reference

我正在尝试在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)值在循环的每次迭代中被覆盖。

知道发生了什么事吗?

3 个答案:

答案 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}}的引用被严重破坏的事实,你就会自己帮忙,只是忘记了它们的存在。