Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中实现关联数组?_Php_Arrays_Php Internals - Fatal编程技术网

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

如何在PHP中实现关联数组?,php,arrays,php-internals,Php,Arrays,Php Internals,有人能解释一下PHP是如何实现关联数组的吗?PHP使用什么底层数据结构?PHP是否对密钥进行散列并将其存储在某种散列映射中?我很好奇,因为我想知道关联数组在插入和搜索键时的性能如何。好吧,无论如何,所有的PHP数组都是关联数组。根据各种网络论坛的消息来源,都是哈希表: 如果您想确定,请阅读源代码,然后编译它,但请确保您可以(警告:PDF,不相关,但非常酷)。@EBGreen是正确的 这会给您带来一些有趣的性能问题,特别是当将数组视为列表并使用[](array add)运算符时。PHP似乎不会缓

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

好吧,无论如何,所有的PHP数组都是关联数组。

根据各种网络论坛的消息来源,都是哈希表:

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

@EBGreen是正确的

这会给您带来一些有趣的性能问题,特别是当将数组视为列表并使用[](array add)运算符时。PHP似乎不会缓存最大的数字键并向其中添加一个,相反,它似乎会遍历所有键以查找下一个数字键应该是什么。我已经用python重写了脚本,因为PHP的数组即列表性能很差


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

这是一个哈希表。类型声明和散列函数如下:


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

投票率最高的答案链接被破坏,没有给出太多解释

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

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


你确定这一点吗?我刚刚在一个包含1000个条目的测试数组上运行了基准测试(一个接一个地复制到一个新数组),如果您不为新数组指定键,那么它的速度会持续提高7%(在PHP5.2.6上),可能是他们最近更改了它。我在做这项工作时使用的是5.1。当你谈论10k或更多条目时,PHP的数组非常糟糕。好吧,事实并非如此,请比较:@RickyMason。通常情况下,您可能不会这样做,但对于彻底的测试,计算10、100、1k和10k的每项时间确实会突出可伸缩性性能问题,特别是如果可能需要处理10k。我将把此链接留给其他人来完成,但您可以查看PHP的实际C源代码,源代码已移动到GitHub: