PHP中的Array和Hash有什么区别?

时间:2009-05-20 01:21:08

标签: php arrays hash language-comparisons

Array和Hash PHP有什么区别?

数组:array(1,2,3...)
哈希:array(key1=value1, key2=value2, ...)

它们是不同还是相同?

※例如,函数参数是否允许数组对哈希有效?

因为我用传统语言区分它并使用它,我很困惑。

3 个答案:

答案 0 :(得分:15)

您描述的内容都是数组。两者之间的唯一区别是您明确设置了第二个键的键,因此它们被称为associative arrays。我不知道你从哪里获得了Hash术语(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了解更多信息。

答案 1 :(得分:1)

实际上,php中没有数组 - 只有关联数组(基本上是一个哈希表)

尝试

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

这样做会从数组中删除“三”,但你会注意到数组键(数组不是关联的)将保持不变(0,1,2,4) - 用任何正常语言将“4”的密钥重新编号为3。

答案 2 :(得分:1)

进入引擎php所有数组(关联或顺序)都是哈希表,这是因为它是读取单个元素的最快方法。在内部有创建和弹出数组的基本功能:

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)

...