如何在PHP中实现关联数组?

时间:2008-10-29 16:26:43

标签: php arrays php-internals

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

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

嗯,对于它的价值,所有 PHP数组都是关联数组。

答案 2 :(得分:6)

最高投票回答链接已被打破,并没有给出那么多解释。

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

为了获得完整的解释,我发现这个链接提供了更多信息。

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

答案 3 :(得分:3)

@EBGreen是正确的。

这会给您带来一些有趣的性能问题,特别是在将数组作为列表处理并使用[](数组添加)运算符时。 PHP似乎没有缓存最大的数字键并添加一个,而是似乎遍历所有键以找到下一个数字键应该是什么。我已经在python中重写了脚本,因为PHP的列表性能令人沮丧。

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

答案 4 :(得分:2)

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

如果你想确定,请阅读源代码,然后进行编译,但请确保trust your compiler(警告:PDF,无关,但非常酷)。