2013-02-08 151 views
1

雖然我發現大多數PHP批評迂腐,但缺乏清晰的數據結構陣容正成爲我日常工作中的實際限制。 array()構造函數創建聲明要做所有事情的數據結構,但事實上,我最終缺乏需要的相關信息纔能有效地使用它。 具體來說,我不知道它是什麼數據結構。這是一個列表嗎?什麼樣的名單?指針數組? Btree?散列表?PHP數組()構造函數創建什麼數據結構?

如何查找執行?由於相同的數據結構具有數值和「關聯」查找,我假設不能像C數組那樣根據偏移量執行查找。

對於少量的數據,我自然不會在意這樣的性能優化。但是,我所使用的軟件已經開始用於適度大的數據結構會讓事情稍微減慢的情況。

此外,是否有可能建立明確提到每個數據結構?怎麼樣?

+1

您可能會發現這個問題非常有用:http://stackoverflow.com/questions/2350361/how-is-the-php-array-implemented-on-the-c-level – templatetypedef

+0

另一種方法是離岸任何困難工作到一種語言,你知道如何有效地寫作 – Patashu

回答

1

我建議最好將數組視爲散列表實現,就好像你花了一點時間與源代碼一樣,你會注意到雖然Zend HT可以作爲DLL遍歷,但大多數操作都可能會有興趣比較(添加,隨機訪問)是典型的HT實現。

如果我們純粹是買賣數字鍵那麼它本質上是一個傳遞到C數組而不涉及散列函數,在這種情況下會有每個鍵正是一個HT桶。當然,動態擴展數組的能力是由定期的內存重新分配來促進的,所以你會在那裏受到懲罰(就像你可能沒有預先分配一個C++中的大型std :: vector)。

HTH。

2

在PHP中,陣列在內部表示爲雙鏈表。有些SPL課程可讓您創建。 PHP的神奇

部分是不是有選擇不同的數據結構,但正如你所觀察到還配備了性能限制。

+2

你提供的鏈接顯然與你的答案矛盾。它說PHP數組被實現爲有序的哈希表。 – templatetypedef

+0

拿起一份[Sara Goldman的擴展和嵌入PHP](http://www.amazon.com/Extending-Embedding-PHP-Sara-Golemon/dp/067232704X)。 「HashTable是一個專門的雙向鏈表,它以查找索引的形式增加了向量的速度和效率。」相信我,他們是雙重鏈接列表下的列表;即使它們在用戶空間中顯示爲散列表。 – quickshiftin

+1

雖然我看到你在說什麼,但哈希表與雙向鏈表相比,具有根本不同的數據結構,並且具有完全不同的性能特徵。它看起來像PHP使用散列表和雙向鏈表,通過它們來獲得這兩個結構的性能優勢。這是一個聰明的主意! – templatetypedef