当前位置:首页 > PHP

php array底层实现

2026-02-15 16:48:12PHP

PHP 数组的底层实现

PHP 的数组(array)是一种混合数据结构,既支持数字索引也支持字符串键(关联数组)。其底层实现基于哈希表(Hash Table)和双向链表(Ordered Linked List),称为“有序哈希表”或“字典”。

哈希表结构

PHP 数组的核心是哈希表(zend_arrayHashTable),通过哈希函数将键(数字或字符串)映射到存储位置。哈希表解决冲突的方式是链地址法(每个桶用链表存储冲突的条目)。

  • 哈希函数:将字符串键转换为哈希值,数字键直接使用。
  • 桶(Bucket):存储键值对,包含键、值、哈希值和指向链表中相邻元素的指针。

有序性实现

PHP 数组的遍历顺序与插入顺序一致,这是通过双向链表实现的。每个桶包含 pListNextpListLast 指针,维护插入顺序的链表。

动态扩容

哈希表会根据元素数量动态调整容量(通常为 2 的幂次方),触发扩容时重新哈希所有元素。

内存优化

PHP 会对纯数字索引数组(如 [0 => 'a', 1 => 'b'])进行优化,直接使用连续内存存储(类似 C 数组),无需哈希表。

示例代码分析

$arr = [
    "foo" => "bar",
    42    => "answer",
];
  • 字符串键 "foo" 通过哈希函数计算哈希值,存入哈希表。
  • 数字键 42 直接作为索引处理。
  • 双向链表维护 "foo"42 的插入顺序。

性能特点

  • 查找/插入/删除:平均时间复杂度 O(1),最坏情况 O(n)(哈希冲突严重时)。
  • 遍历:时间复杂度 O(n),顺序与插入顺序一致。
  • 内存占用:高于纯索引数组(如 C 数组),因需存储哈希表和链表结构。

内部结构(简化)

struct _zend_array {
    Bucket       *arData;       // 存储桶的数组
    uint32_t      nTableSize;   // 哈希表大小
    uint32_t      nNumUsed;     // 已用桶数
    uint32_t      nNumOfElements; // 有效元素数
    uint32_t      nTableMask;   // 哈希掩码(nTableSize - 1)
    uint32_t      nInternalPointer; // 遍历指针
    zend_long     nNextFreeElement; // 下一个数字键值
    Bucket       *pListHead;    // 链表头
    Bucket       *pListTail;    // 链表尾
};

参考资料

  • PHP 内核源码(zend_hash.hzend_hash.c)。
  • PHP 官方文档关于数组的实现细节。

php array底层实现

标签: 底层php
分享给朋友:

相关文章

php实现文件上传

php实现文件上传

PHP 文件上传实现方法 在 PHP 中实现文件上传需要处理 HTML 表单和服务器端脚本。以下是详细步骤: 创建 HTML 表单 使用 enctype="multipart/form-data"…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php实现跳转

php实现跳转

PHP 实现页面跳转的方法 在 PHP 中实现页面跳转有多种方式,以下是常见的几种方法及其适用场景: 使用 header() 函数 通过 header() 函数发送 HTTP 头部信息实现跳转。注意…