|
1
31
PHP关联数组实际上是 HashTables . 如果将它们合并,则为关联数组。 在数字数组中,它与C非常相似。你有一个指向ZVAL结构的指针数组。
在PHP中,类型是ZVAL结构(因为这样它实现了动态类型),但在关联数组中也有帮助,因为可以假定固定长度。因此,即使直接访问阵列的速度较慢,它仍然被认为是O(1)。 那么字符串键会发生什么呢?PHP使用哈希函数将它们转换为整数。 在数值数组和关联数组中搜索效率相似,因为它们在内部都是数值的。 由于附加级别(哈希函数),只有直接访问数组键的速度较慢。 |
|
|
2
39
在阅读了zend/zend\u hash.h和ext/standard/array.c之后,我想我已经找到了答案(感谢Chris和gumbo的建议)。 PHP数组是一个链式哈希表(在键冲突时查找O(c)和O(n)),允许int和string键。它使用两种不同的散列算法将这两种类型放入相同的散列密钥空间。此外,哈希中存储的每个值都链接到它之前存储的值和之后存储的值(链表)。它还有一个临时指针,用于保存当前项,以便可以迭代散列。
接球手
这个发现让我有些困扰,因为这意味着PHP中没有具有正常C数组特征的数据类型。现在大多数情况下这是可以的,因为散列查找速度非常快,但是在这样的情况下它的错误会显示出来
考虑下面的两个例子: 阵列内版本
我希望zend HashTable数据结构中有一个透明的标志,在使用
|
|
3
6
因为PHP数组
are ordered maps
(即使使用连续整数索引)
因为你的
|
|
4
3
看一看
|
|
|
5
2
请参阅文档中的这条评论,确认您的两难处境:数组\u rand虽然对于小型数组来说速度很快,但可扩展性非常差。
|