PHP array是PHP的核心功能之一。它是稀疏的,允许在同一数组中使用多类型键,并支持集合,字典,数组,堆栈/队列和迭代功能。
array
但是在使用PHP一段时间之后,我发现相当多的array_*功能比您乍看之下要慢得多。就像在array_rand非常大的数组(10000+)的情况下一样。array_rand实际上,它是如此之慢,以至于在您将php数组用作索引数组的情况下,像这样的函数rand( 0, array_length( $array ) - 1 )运行MUCH的速度比快array_rand。
array_*
array_rand
rand( 0, array_length( $array ) - 1 )
现在到我的问题。
PHP数组如何在C级别上实现? 这对于预测大量使用PHP数组数据类型的不同功能的函数的Big O很有帮助。
PHP关联数组实际上是 HashTables的实现。
在内部,可以制作数字数组或关联数组。如果将它们组合在一起,则它是关联数组。
在数字数组中,它与C非常相似。您具有指向ZVAL结构的指针数组。
因为指针具有固定长度(我们称其为n),所以偏移(x)的计算很容易:x * n。
在PHP中,类型为ZVAL结构(因为它实现了动态类型),但它也有助于关联数组,因为您可以假定定长。因此,即使直接访问数组的速度较慢,仍将其视为O(1)。
那么字符串键会发生什么呢?PHP使用哈希函数将其转换为整数。
在数字和关联数组中搜索具有相似的效率,因为在内部它们都是数字。
由于具有附加级别(散列功能),因此仅直接访问阵列键的速度较慢。