PHP中数组和哈希的区别是什么?

6

数组和哈希在PHP中有什么区别?

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

它们是不同的还是相同的?

※ 例如,函数参数是否允许将数组应用于哈希?

因为我通过传统语言进行区分并使用它,所以感到困惑。

3个回答

15

你所描述的两个东西都是数组。它们之间唯一的区别在于,你明确地为第二个设置了键,并因此被称为关联数组。我不知道你从哪里听到“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函数大多数情况下会接受这些“类型”之一的数组并执行您想要的操作,但需要注意区别,因为某些函数会对索引进行奇怪的处理,而有些则不会。在使用数组函数之前最好阅读文档,因为它会根据数组键说明输出结果。

您应该阅读手册以获取更多信息。


2
PHP数组内部数据类型的“驱动”被称为HashTable。 - VolkerK

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)

......


1
实际上,PHP 中没有数组 - 只有关联数组(基本上是哈希表)。
尝试执行:
$ar=array("zero","one","two","three","four");
unset($ar[3]);

这样做将从数组中删除"three",但是您会注意到数组键(数组不是关联的)仍将保持不变(0,1,2,4)。在任何正常的语言中,它都会将"four"的键重新编号为3。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接