2014-09-06 52 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的參考文獻非常糟糕,並且忘記了它們的存在這一事實,那麼你會自己幫忙。