2011-03-16 166 views
8

當按下一個新的值到一個索引數組PHP如何跟蹤關聯數組中的順序?

$array[] = 'new value'; 

PHP文檔解釋了它如何被在[MAX_INDEX + 1]位置加入。

當推一個新值到一個關聯數組

$array['key'] = 'new value'; 

它的工作原理是相同的,但我沒有看到任何解釋文件以確認如何或爲何它這樣做。該命令似乎在我的實施中是一致的,但我怎麼知道訂單將保持不變?有誰知道PHP如何在後端實現這一點?

+2

我相信實施細則都在[zend_hash.c(http://svn.php.net/viewvc/php/php被發現-src /中繼/ Zend的/ zend_hash.c?視圖=標記)。索引保持獨立我假設,並且' - > pInternalPointer'顯示最後。 – mario 2011-03-16 17:42:20

+1

它們可能只是鏈接哈希映射。鏈接提供順序而不管哈希。 – 2011-03-16 17:54:32

+0

偉大的答案!正是我在找的! :-) – 2015-01-17 18:33:43

回答

0

How are associative arrays implemented in PHP?可能會給你一些見解。

似乎PHP數組基本上是哈希表,所以數組的順序將保持不變,直到您重新排序爲止(例如,通過對數組進行排序)。

編輯:看來這是越來越downvoted,請允許我明確包括我掛在下面這裏註釋的源...

+6

對不起死靈,但這個答案沒有意義。如果它是一個簡單的散列表,條目的順序應該基於每個鍵的散列值,而不是插入順序。實際上,這就是哈希表在其他語言中的表現。然而PHP關聯數組似乎跟蹤了插入的順序。所以這個問題對我來說還是開放的。它是如何做到的?它可以依賴嗎? – Tobia 2014-07-02 16:58:10

+0

http://stackoverflow.com/questions/2350361/how-is-the-php-array-implemented-on-the-c-level – n00dle 2014-07-03 08:40:22

+0

http://nikic.github.io/2012/03/28/Understanding -PHPs內部陣列-implementation.html – n00dle 2014-07-03 08:41:59

2

MAX_INDEX實際上與排序無關。
你可以做

$array[5] = 'new value'; 
$array[1] = 'new value'; 
$array[105] = 'new value'; 
$array[2] = 'new value'; 

和陣列將保留該順序爲好。

PHP數組是一個有序的映射,所以它是保持它的順序的映射。
數組元素只是在添加它們之後保持順序(或者它完全由某個數組操作函數修改)。這就是全部。

0

我寧願依靠ksort。根據我的經驗,在開始移除元素之前,數組保持一致。最好手動對它們進行排序,並知道它們的順序是你想要的。

+0

刪除元素有什麼問題? – 2011-03-16 17:46:11

+0

我記得在刪除元素和排序數組時遇到了問題。可能只是我的編程不佳,但卻導致我習慣於總是定義數組的順序,如果我依賴它的話。 – Ryre 2011-03-16 17:57:06