2013-07-23 109 views
3
$array = array(); 
$array[ 'recursive' ] =& $array; 

$array[ 'foo' ] = $array; 

'foo' PHP奇怪的行爲是由值分配給$array,這應該複製$array,這並沒有在當時'foo'關鍵,所以我希望這種情況到現在爲止是這樣的:遞歸陣列

$array = array(
    'recursive' => &$array, 
    'foo'  => array(
     'recursive' => &$array 
    ), 
) 

但如果我現在做的事:

var_dump(isset($array[ 'foo' ][ 'foo' ][ 'foo' ])); 

我得到:

bool(true) 

我不明白這是爲什麼。

如果我創造的'foo'分配一箇中間變量,比如:

$array = array(); 
$array[ 'recursive' ] =& $array; 

$blah = $array; 
$array[ 'foo' ] = $blah; 

var_dump(isset($array[ 'foo' ][ 'foo' ][ 'foo' ])); 

我得到:

bool(false) 

我明白爲什麼'recursive'關鍵將是無限深,因爲這是通過引用分配,但爲什麼'foo'密鑰是按值賦值的?如何爲由值處理的事物創建中間變量變化行爲?

+0

它可能與此有關:http://stackoverflow.com/questions/17528280/why-does-reference-assigning-an-arrays-element-modify-the-array/17528610#17528610,看看是否你可以弄明白。現在對我來說已經太遲了。 :) – deceze

+0

我試圖想象代碼執行時符號表的樣子,根據您鏈接的答案,但我只能達到我期望的行爲,而不是我所看到的行爲。 – Jesse

回答

0

因爲當你做$ array ['foo'] = $ array時,解釋器首先將'foo'索引添加到$ array值,然後將新更新的數組放入$ array ['foo']中。

當您使用中間$ blah時,您已經在'foo'鍵創建之前存儲了$ array的未修改副本。中間體不會改變行爲,它會在創建中間體的時刻存儲值的副本,就像它應該那樣。

+1

那麼爲什麼'$ a = array(); $ a ['foo'] = $ a;'不產生遞歸? – Jesse

+0

@Jesse只是想問一樣的:)。我認爲這是錯誤的陳述。我們需要查看PHP源代碼。 –