PHP 数组及其方法应该是每一个 PHPer 在编码过程中用到的最频繁的一种数据结构了,但是对于他的实现原理又了解多少呢 ?我在 <PHP弱类型实现原理> 中已经介绍过,PHP 数组的底层数据结构是 HashTable,今天我们就来看下它的实现原理。
首先看下 HashTable 的底层数据结构:
typedef struct _hashtable {
uint nTableSize; // 哈希槽的数量,初始化为8,以2倍扩容
uint nTableMask; // 哈希表的取模值,为 nTableSize-1
uint nNumOfElements; // 元素数量,即 Bucket 的数量,这个跟哈希槽数量并没有对应关系
ulong nNextFreeElement; // 下一个可用的数字索引
Bucket *pInternalPointer; // 内部链表指针,如经常用的 current,next 等方法
Bucket *pListHead; // 指向整个数组的头部,可以方便实现 array_(un)shift 功能
Bucket *pListTail; // 指向整个数组的尾部,可以方便实现 array_push/pop 功能
Bucket **arBuckets; // 哈希槽的指针,每个槽可能会有一组Bucket
... // 其他元素暂时忽略
} HashTable;
再看下 Bucket 的数据结构:
typedef struct bu