24

有人可以解释 PHP 如何实现关联数组吗?PHP 使用什么底层数据结构?PHP是否对密钥进行哈希处理并将其存储在某种哈希映射中?我很好奇,因为我想知道关联数组在插入和搜索键时的性能如何。

4

5 回答 5

8

投票最高的答案链接已损坏,并没有给出太多解释。

PHP 是用 C 编写的,底层结构只是一个 C 数组。C 数组只是内存块。C 数组中的索引必须是连续的,不能有索引 0 和后面的索引 1000。为了使关联数组键起作用,在将它们添加到 C 数组之前,它们会通过散列函数转换为适当的 C 索引。

对于完整的解释,我发现此链接提供了更多信息。

http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html

于 2014-04-21T23:26:32.777 回答
7

这是一个哈希表。类型声明和哈希函数在这里:
http ://svn.php.net/viewvc/php/php-src/trunk/Zend/zend_hash.h?view=markup

spl(标准php lib)中有一个轻量级数组和一个链表

于 2010-04-22T18:54:11.857 回答
6

好吧,就其价值而言,所有PHP 数组都是关联数组。

于 2008-10-29T16:28:22.373 回答
3

@EBGreen 是正确的。

这会给您带来一些有趣的性能问题,尤其是在将数组视为列表并使用 [](数组添加)运算符时。PHP 似乎没有缓存最大的数字键并向其添加一个,而是似乎遍历所有键以查找下一个数字键应该是什么。由于 PHP 令人沮丧的数组即列表性能,我用 python 重写了脚本。

关联数组具有标准的 dict/hash 性能开销。

于 2008-10-29T17:14:36.787 回答
2

根据各种网络论坛的来源,这都是哈希表: http ://www.usenet-forums.com/php-language/15348-zend-engine-array-implementation.html

如果您想确定,请阅读源代码,然后编译它,但请确保您可以信任您的编译器(警告:PDF,不相关,但非常酷)。

于 2008-10-29T16:52:05.693 回答