php数组的内部实现
PHP数组的内部实现
PHP的数组实际上是一个有序的哈希表(Hash Table),它结合了链表和哈希表的特性,既能通过数字索引快速访问,也能通过字符串键高效查找。
哈希表结构
PHP数组的核心是zend_array结构(PHP 7之前称为HashTable)。它包含以下关键部分:
- 存储桶(Bucket):存储键值对,包含哈希值、键和值。
- 哈希函数:将键转换为哈希值,用于快速定位。
- 冲突解决:使用链表解决哈希冲突。
有序性实现
PHP数组的有序性通过双向链表维护:
- 每个Bucket包含
pListNext和pListLast指针,指向插入顺序的前后元素。 - 遍历数组时按插入顺序输出,而非哈希表中的物理顺序。
内存管理
PHP 7优化了数组内存占用:
- 使用
zend_array替代旧版HashTable,减少内存开销。 - 值存储采用
zval结构,直接嵌入数组而非指针,降低内存碎片。
动态扩容
数组容量不足时自动扩容:
- 初始容量为8,负载因子超过阈值时扩容为当前大小的2倍。
- 扩容后重新哈希所有元素,平衡性能与内存。
特殊优化
- 数字键数组:连续数字索引可能优化为纯数组(Packed Array),跳过哈希计算。
- 不可变数组:PHP 8引入
Immutable数组,减少复制开销。
示例代码分析
$array = [
'foo' => 'bar',
42 => true,
];
- 字符串键
'foo'通过哈希函数计算位置。 - 数字键
42直接作为索引处理(若连续则可能优化为Packed Array)。
性能考虑
- 大数据量时哈希冲突会降低性能,需合理选择键类型。
- 频繁插入/删除可能导致内存重组,影响效率。
PHP数组的设计平衡了灵活性和性能,使其既能作为列表也能作为字典使用。







