2009-05-20 84 views
4

數組和哈希PHP有什麼區別?PHP中的Array和Hash有什麼區別?

數組:array(1,2,3...)
散列:array(key1=value1, key2=value2, ...)

是它們不同或相同?

※例如,函數參數是否允許數組對散列有效?

因爲我用傳統語言區分它並使用它,所以我感到困惑。

回答

14

你所描述的東西都是數組。兩者之間的唯一區別是您明確設置了第二個密鑰,因此它們被稱爲associative arrays。我不知道你從哪裏得到(Perl?)的哈希術語,但這不是他們在PHP中提到的。

因此,舉例來說,如果你做到這一點:

$foo = array(1,2,3,4,5); 
print_r($foo); 

輸出將是:

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 4 
    [4] => 5 
) 

正如你所看到的,鍵來訪問你把個人價值是爲你創造的,但是在那裏。所以這個數組本質上也是聯想的。數組的另一種「類型」是完全一樣的,除非你明確地說「我想訪問這個值與這個鍵」而不是自動數字索引(儘管你提供的鍵也可以是數字)。

$bar = array('uno' => 'one', 'dos' => 'two'); 
print_r($bar); 

將輸出:

Array 
(
    [uno] => one 
    [dos] => two 
) 

正如你可能然後期待,做print $bar['one']將輸出uno,並從第一個例子做$foo[0]將輸出1

至於功能去的,PHP函數將大部分時間採取任何這些陣列的「類型」之一,你想要做什麼他們,但也有區別需要注意的,因爲有些功能會做時髦東西給你的索引,有些則不會。通常最好在使用數組函數之前閱讀文檔,因爲它會記錄輸出取決於數組的鍵。

你應該read the manual欲瞭解更多信息。

+0

加UNO:P .. – alex 2009-05-20 01:51:23

1

在實際中,有在PHP沒有陣列 - 僅存在關聯數組(這基本上是一個哈希表)

嘗試做

$ar=array("zero","one","two","three","four"); 
unset($ar[3]); 

這樣做會從數組中刪除「三」 ,但是您會注意到數組鍵(數組不是關聯的)將保持不變(0,1,2,4) - 在任何常規語言中,它會將「4」的鍵重新編號爲3。

1

在引擎php中,所有數組(關聯或順序)都是散列表,這是因爲它是讀取單個元素的最快方法。內部有基本的函數來創建和popolate數組:

int zend_hash_init(HashTable *ht, uint nSize,hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent); 

int zend_hash_add(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest) 

int zend_hash_update(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest) 

int zend_hash_index_update(HashTable *ht, ulong h, void *pDate, uinit nDataSize, void **pDest) 

int zend_hash_next_index_insert(HashTable *ht, void *pData, uinit nDataSize, void **pDest) 

int zend_hash_add(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest) 

int zend_hash_update(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest) 

int zend_hash_index_update(HashTable *ht, ulong h, void *pDate, uinit nDataSize, void **pDest) 

int zend_hash_next_index_insert(HashTable *ht, void *pData, uinit nDataSize, void **pDest) 

......

相關問題