2012-07-04 81 views
1

我有一個數組的嵌套數組,我想洗牌內部數組。我的代碼看起來像這樣(簡化):PHP shuffle在我的嵌套數組上無法正常工作

$a = array(array('banana', 'peach'), array('ding', 'dong'), array('oh snow')); 
foreach ($a as &$arr) { 
    shuffle($arr); 
} 
var_dump($a); 

後續代碼var_dump輸出這樣的:

array(3) { [0]=> array(2) { [0]=> string(5) "peach" [1]=> string(6) "banana" } [1]=> array(2) { [0]=> string(4) "ding" [1]=> string(4) "dong" } [2]=> &array(1) { [0]=> string(7) "oh snow" } } 

正如你可以在輸出中看到,前兩個子陣列工作,但第三子陣列通過引用鏈接在輸出...

在我的全應用,這最後一個數組鏈接導致的問題,但不是解決這個問題的工作,我想解決這個洗牌的事情...

乾杯!

+0

我還可以補充說,它與只包含一個項目的子數組無關,而是與最後一個數組發生的情況,因爲它是集合中的最後一個.. – Tominator

回答

2

這與PHP如何存儲對數組元素的引用有關。它不能引用數組的元素,只能引用數值。因此它必須將值array('oh snow')存儲在符號表的「插槽」中,然後使$arr$a[2]作爲該值的參考。

要修復此問題,請在unset($arr)後循環。這樣,只有一個變量引用了這個值,然後再將它變成一個常規的數組索引。無論如何,在foreach之後取消設置是很好的做法,因爲有很多這樣的陷阱。

+0

非常聰明(還有一點我以前從未聽說過的知識)!我確實只是玩了一下,洗牌功能與這個問題根本沒有任何關係。在for循環之後取消設置$ arr,謝謝! – Tominator

+0

當新代碼突然開始行爲不端時,將我保存在實時運行中。如果沒有找到答案,我永遠都不會意識到這一點,所以爲你+1 :-) – markdwhite

相關問題