当前位置: 首页 > 面试题库 >

PHP数组如何在C级别上实现?

哈栋
2023-03-14
问题内容

PHP array是PHP的核心功能之一。它是稀疏的,允许在同一数组中使用多类型键,并支持集合,字典,数组,堆栈/队列和迭代功能。

但是在使用PHP一段时间之后,我发现相当多的array_*功能比您乍看之下要慢得多。就像在array_rand非常大的数组(10000+)的情况下一样。array_rand实际上,它是如此之慢,以至于在您将php数组用作索引数组的情况下,像这样的函数rand( 0, array_length( $array ) - 1 )运行MUCH的速度比快array_rand

现在到我的问题。

PHP数组如何在C级别上实现? 这对于预测大量使用PHP数组数据类型的不同功能的函数的Big O很有帮助。


问题答案:

PHP关联数组实际上是 HashTables的实现。

在内部,可以制作数字数组或关联数组。如果将它们组合在一起,则它是关联数组。

在数字数组中,它与C非常相似。您具有指向ZVAL结构的指针数组。

因为指针具有固定长度(我们称其为n),所以偏移(x)的计算很容易:x * n。

在PHP中,类型为ZVAL结构(因为它实现了动态类型),但它也有助于关联数组,因为您可以假定定长。因此,即使直接访问数组的速度较慢,仍将其视为O(1)。

那么字符串键会发生什么呢?PHP使用哈希函数将其转换为整数。

在数字和关联数组中搜索具有相似的效率,因为在内部它们都是数字。

由于具有附加级别(散列功能),因此仅直接访问阵列键的速度较慢。



 类似资料:
  • 问题内容: 是否可以在PHP中使用其他名称对函数进行别名?假设我们有一个名称为的函数。有没有一种方法可以使别名为? 现在,我正在这样做: 问题答案: 仅PHP 5.6+ 从PHP 5.6开始,可以通过导入功能来别名函数:

  • 问题内容: 如何在PHP中合并n个数组 我的意思是我怎么可以这样做的工作: OR 里面有多个数组的数组在哪里,像这样: 我的结果是: 我需要的是 问题答案: array_merge可以接受可变数量的参数,因此,使用一些call_user_func_array技巧,您可以将数组传递给它: 基本上可以像输入以下内容一样运行: 更新: 现在有了5.6,我们有了运算符来将数组解压缩为参数,因此您可以: 并

  • 问题内容: 我试图了解Java如何在内部存储整数。我知道所有Java基本整数都是带符号的(短符号除外)。这意味着该数字在一个字节中减少了一位。 我的问题是,是否所有整数(正数和负数)都存储为二进制补码,或者仅是负数在二进制补码中? 我看到规格说明了。但是我经常感到困惑。 例如: 编辑 要清楚一点 因此,如果你的答案是 数字存储为二进制补码,则: 这里的混乱再次是符号说的,它们都是负数。可能是我误读

  • 问题内容: 我想向正在处理的类中添加一些log.debug语句,并且希望在运行测试时在输出中看到它。我想在命令行上覆盖log4j属性,如下所示: 我经常做这种事情。我特别只对在命令行上传递它的方式感兴趣。我知道如何使用配置文件进行操作,但这不适合我的工作流程。 问题答案: log4j不直接支持此功能。 由于您不希望使用配置文件,因此很可能使用编程配置。我建议您考虑扫描所有系统属性,并根据此内容显式

  • 第一次用AMH,有个问题,如何来升级PHP,NGINX和MYSQL? 安装的时候选择好了版本,之后如何来升级这些东西呢? 没有找到哪里可以升级

  • 我正在开发Spring Boot应用程序,并使用application.yml文件进行配置,看起来如下所示: 我希望将这些值访问到我的@Entity级别类中,如下所述: