2009-08-25 94 views
7

PHP數組類型實際上比傳統的C數組更類似於有序映射。這是PHP的原始通用數據結構。該手冊可以說The indexed and associative array types are the same type in PHP, which can both contain integer and string indicesPHP中「關聯」和「索引」數組之間的實際區別是什麼?

但是,有很多情況下,內置語言功能會區分「索引」數組(具有順序整數鍵的數組)和「關聯」數組(具有非順序和/或混合型)。

其中一個例子是array_merge函數。

如果輸入數組具有相同的字符串鍵,則該鍵的後面的值將覆蓋前一個鍵。但是,如果數組包含數字鍵,則後面的值不會覆蓋原始值,但會被追加。

如果只給出一個數組並且數組索引,則按照連續方式重新索引鍵。

PHP中的其他地方在索引和關聯數組之間有所區別?我特別感興趣的是Userland的差異,儘管對PHP源代碼中數組實現的深入瞭解也很有趣。

回答

3

想到的最普遍的一種是索引數組可以通過使用傳統的for迴路中循環,而關聯一個不能(因爲它沒有數字索引):

for ($i = 0; $i < count($indexed_array); $i++) 
{ 
    // do something with $indexed_array[$i] 
} 

當然,PHP也有一個foreach關鍵字,這兩種類型的作品都是一樣的。

+1

+1以獲得更好的信息,但應該注意的是,您可以使用next()函數循環索引數組和關聯數組。換句話說,關聯數組仍然有一些內部的秩序概念。 – 2009-08-25 19:42:03

+1

沒錯,並且沿着這些方向,索引數組並不一定具有預期的順序 - 相反,數組使用的順序(使用'foreach'或'next()',取決於它的順序)所以如果在$ arr [2]之前設置$ arr [3],那麼迭代時將保留該順序。 – 2009-08-25 21:20:50

0

幾乎所有的核心排序功能(所有sortksort,asort變化取決於您是否要維護密鑰關聯等)。

5

實際上,任何數組,無論是索引還是關聯,都是一個散列表(加上一個維護元素順序的雙向鏈表)。但是,在用戶級PHP代碼中,索引和關聯數組幾乎總是用於不同的目的,有時需要以不同的方式處理,所以爲了方便起見,諸如sort/asort之類的幾個函數對它們進行了區分。

+0

+1用於區分實現和用戶區代碼。這是我感興趣的userland內容。 – 2009-08-25 18:39:20

3

..然後有SplFixedArray,從5.3開始,它只支持整數索引,具有固定的大小,並且通常比本地數組快。

+2

對信息有+1,但請記住標準PHP庫數組對象不會與現有的PHP數組函數兼容,這可能會對老手產生刺激。 – 2009-08-25 19:00:05

2

我發現的一個有趣的差異是使用json_encode時。

json_encode(array(0=>0,1=>1,2=>2)); 
> [0,1,2] 
json_encode(array(0=>0,2=>2)); 
> {"0":0,"2":2} 

作爲一個孤獨的例子這是有道理的,但它是用時,比方說,array_filter組合更令人驚訝。

$f = function($x) { return $x != 1; }; 
json_encode(array_filter(array(0,1,2), $f)); 
> {"0":0,"2":2} 

我們從數值數組開始,過濾了一些元素,但生成的json是一個關聯數組!


請注意,我們可以通過使用array_values來獲得所需的json。

json_encode(array_values(array_filter(array(0,1,2),$f))); 
> [0,2] 
相關問題