有人可以解释 PHP 如何实现关联数组吗?PHP 使用什么底层数据结构?PHP是否对密钥进行哈希处理并将其存储在某种哈希映射中?我很好奇,因为我想知道关联数组在插入和搜索键时的性能如何。
5 回答
投票最高的答案链接已损坏,并没有给出太多解释。
PHP 是用 C 编写的,底层结构只是一个 C 数组。C 数组只是内存块。C 数组中的索引必须是连续的,不能有索引 0 和后面的索引 1000。为了使关联数组键起作用,在将它们添加到 C 数组之前,它们会通过散列函数转换为适当的 C 索引。
对于完整的解释,我发现此链接提供了更多信息。
http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html
这是一个哈希表。类型声明和哈希函数在这里:
http ://svn.php.net/viewvc/php/php-src/trunk/Zend/zend_hash.h?view=markup
spl(标准php lib)中有一个轻量级数组和一个链表
好吧,就其价值而言,所有PHP 数组都是关联数组。
@EBGreen 是正确的。
这会给您带来一些有趣的性能问题,尤其是在将数组视为列表并使用 [](数组添加)运算符时。PHP 似乎没有缓存最大的数字键并向其添加一个,而是似乎遍历所有键以查找下一个数字键应该是什么。由于 PHP 令人沮丧的数组即列表性能,我用 python 重写了脚本。
关联数组具有标准的 dict/hash 性能开销。
根据各种网络论坛的来源,这都是哈希表: http ://www.usenet-forums.com/php-language/15348-zend-engine-array-implementation.html
如果您想确定,请阅读源代码,然后编译它,但请确保您可以信任您的编译器(警告:PDF,不相关,但非常酷)。