2009-05-20 86 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) 

......

相关问题