数组_zend_array

zend_array 和 HashTable 都是 _zend_array 结构体的别名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
185 struct _zend_array {
186 zend_refcounted_h gc; // 垃圾回收相关
187 union {
188 struct {
189 ZEND_ENDIAN_LOHI_4(
190 zend_uchar flags,
191 zend_uchar nApplyCount,
192 zend_uchar nIteratorsCount,
193 zend_uchar consistency)
194 } v;
195 uint32_t flags;
196 } u; // 主要是flags
197 uint32_t nTableMask; // 它本身的值就是几个桶, 和h进行或运算可以计算最终落在哪个桶里
198 Bucket *arData; // 指向一个数组, 数组中的每一个元素都是一个bucket, buket是一个结构体, 其中存储key-value对,*arData表示这个数组的内存首地址
199 uint32_t nNumUsed; // bucket中有多少个被使用了
200 uint32_t nNumOfElements; // 真正有意义的值
201 uint32_t nTableSize; // bucket的大小, 初始值是8
202 uint32_t nInternalPointer; // 内部指针
203 zend_long nNextFreeElement; // 不指定key赋值value的时候, key就从这里获取, 初始化为0
204 dtor_func_t pDestructor; // 函数指针, 用来析构用的
205 };
1
2
3
4
5
typedef struct _Bucket {
zval val; // key-value的value
zend_ulong h; /* hash value (or numeric index) */ // 通过hash算法算出来的hash值
zend_string *key; /* string key or NULL for numerics */ // key-value的key
} Bucket;

数组初始化:

数组添加数据:

数组删除数据:

数组获取数据: