当前位置:首页 > PHP

php数组的内部实现

2026-04-03 12:12:09PHP

PHP 数组的内部实现

PHP 的数组是一种混合数据结构,既实现了有序映射(类似字典),又保留了插入顺序。其内部实现经过多次优化,以下是核心机制:

哈希表(HashTable)

PHP 数组底层使用哈希表存储数据,通过散列函数将键名映射到特定槽位。哈希表由两部分组成:

  • 存储桶(Bucket):包含键、值、哈希值及链表指针的结构体
  • 双向链表:维护元素的插入顺序,支持迭代时按插入顺序遍历
// PHP 内核中的 Bucket 结构(简化)
typedef struct _Bucket {
    zval              val;       // 存储的值
    zend_ulong        h;         // 哈希值(数值键直接使用)
    zend_string      *key;       // 字符串键
    struct _Bucket   *next;      // 哈希冲突链表
    struct _Bucket   *prev;      // 双向链表前驱
} Bucket;

动态扩容机制

哈希表会根据元素数量动态调整容量:

  • 初始默认大小为 8 个槽位
  • 当元素数量超过当前容量的 3/4 时触发扩容
  • 新容量为当前容量的 2 倍(直到达到预定义的最大值)

冲突解决

采用链地址法处理哈希冲突:

  • 相同哈希值的元素通过链表连接
  • PHP 7 优化为将冲突链表嵌入到存储桶数组,减少内存访问次数

有序性保证

通过维护双向链表实现有序遍历:

php数组的内部实现

  • 每个 Bucket 包含 prevnext 指针
  • HT 结构保存链表头尾指针,确保 foreach 按插入顺序输出

内存优化(PHP 7+)

  • 打包数组(Packed Array):对连续数字键(0,1,2...)的数组,省略键名存储直接使用索引
  • 内存局部性优化:将 Bucket 与值一起分配,减少 CPU 缓存未命中

性能特性

  • 平均时间复杂度
    • 插入/删除:O(1)
    • 查找:O(1)
  • 内存占用:每个元素约 56 字节(PHP 7+ 优化前为 96 字节)

特殊操作的影响

  • unset() 不会立即释放内存,只是标记为 IS_UNDEF
  • array_splice() 会导致重建双向链表,时间复杂度 O(n)
  • 数值键和字符串键的哈希方式不同:
    $arr = [1 => 'a', "1" => 'b']; // 输出: [1 => "b"](二者哈希值相同)

代码示例观察行为

$array = [];
$array["foo"] = "bar";  // 哈希表插入字符串键
$array[42] = "answer";  // 数值键直接使用整数哈希
unset($array["foo"]);   // 标记 Bucket 为 UNDEF

// 查看内部结构(需安装调试扩展)
debug_zval_dump($array);

通过理解这些机制,可以更高效地使用 PHP 数组,避免如频繁扩容或混合键类型导致的性能下降问题。

标签: 数组php
分享给朋友:

相关文章

vue实现数组平均值

vue实现数组平均值

计算数组平均值的方法 在Vue中计算数组的平均值可以通过多种方式实现。以下是几种常见的方法: 方法一:使用计算属性 export default { data() { retu…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…

java如何初始化数组

java如何初始化数组

初始化数组的方法 在Java中,数组可以通过多种方式进行初始化。以下是几种常见的方法: 静态初始化(直接赋值) 在声明数组时直接指定元素值,适用于已知数组内容的情况: int[] numbers…

php https实现

php https实现

PHP 中实现 HTTPS 的方法 在 PHP 中实现 HTTPS 主要通过配置服务器和编写代码来确保通信的安全性。以下是几种常见的方法: 配置服务器支持 HTTPS 确保服务器已安装 SSL/T…