2014-09-06 43 views
0

我想将整数引用添加到PHP中的数组,但由于某种原因它不起作用。至于为什么我完全困惑。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

这是为什么?只需使用'array_keys()'。并且 - 是的,在你的情况下,你将以多个引用结束(循环结束)值 - 请参阅下面的回答 – 2014-09-06 13:44:07

回答

1

$key正在改变循环的每次迭代,因此您对$key的引用始终是对当前值$key的引用,它(在循环结束时)是3 ....因此所有三个引用到$key都指向了一个和$键的唯一实例,其中有3

值考虑为:

迭代#1

$key被赋值为1; $param_ref[0]是对$key的引用,所以它指向一个值为1的变量。

迭代#2

$关键现在有2,值; $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

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); 
} 
+0

我宁愿使用'array_keys()'部分__“如何获得预期的结果” __ – 2014-09-06 13:42:18

+0

+1提供“如何获得预期的结果” – 2014-09-06 13:45:35

+0

@AlmaDo:那根本没有趣! :-) – Jon 2014-09-06 13:46:10

0

$param_ref值不会被覆盖,这是一个foreach作品一般多少。还有很多人谈到的关于foreach($foo as &$bar)问题的原因,如果您搜索,您可以阅读它。事情是,当你做= &$key;,你不创建一个参考$key是指向,你创建参考$key值。当这个值改变时,所有对$key的引用都会改变。无论如何,正如已经指出的无数次,如果你接受了PHP的参考文献非常糟糕,并且忘记了它们的存在这一事实,那么你会自己帮忙。