@@ -254,17 +254,66 @@ ZEND_API int ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const char *key,
254254ZEND_API int ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h);
255255ZEND_API void ZEND_FASTCALL zend_hash_del_bucket(HashTable *ht, Bucket *p);
256256```
257- #### 7.7.5.5 数组遍历
258-
259-
257+ #### 7.7.5.5 遍历
258+ 数组遍历类似foreach的用法,在扩展中可以通过如下的方式遍历:
259+ ``` c
260+ zval *val;
261+ ZEND_HASH_FOREACH_VAL (ht, val) {
262+ ...
263+ } ZEND_HASH_FOREACH_END();
264+ ```
265+ 遍历过程中会把数组元素赋值给val,除了上面这个宏还有很多其他用于遍历的宏,这里列几个比较常用的:
266+ ```c
267+ //遍历获取所有的数值索引
268+ #define ZEND_HASH_FOREACH_NUM_KEY(ht, _h) \
269+ ZEND_HASH_FOREACH(ht, 0); \
270+ _h = _p->h;
271+
272+ //遍历获取所有的key
273+ #define ZEND_HASH_FOREACH_STR_KEY(ht, _key) \
274+ ZEND_HASH_FOREACH(ht, 0); \
275+ _key = _p->key;
276+
277+ //上面两个的聚合
278+ #define ZEND_HASH_FOREACH_KEY(ht, _h, _key) \
279+ ZEND_HASH_FOREACH(ht, 0); \
280+ _h = _p->h; \
281+ _key = _p->key;
282+
283+ //遍历获取数值索引key及value
284+ #define ZEND_HASH_FOREACH_NUM_KEY_VAL(ht, _h, _val) \
285+ ZEND_HASH_FOREACH(ht, 0); \
286+ _h = _p->h; \
287+ _val = _z;
288+
289+ //遍历获取key及value
290+ #define ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val) \
291+ ZEND_HASH_FOREACH(ht, 0); \
292+ _key = _p->key; \
293+ _val = _z;
294+
295+ #define ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _val) \
296+ ZEND_HASH_FOREACH(ht, 0); \
297+ _h = _p->h; \
298+ _key = _p->key; \
299+ _val = _z;
300+ ```
260301#### 7.7.5.6 其它操作
261302``` c
303+ // 合并两个数组,将source合并到target,overwrite为元素冲突时是否覆盖
262304#define zend_hash_merge (target, source, pCopyConstructor, overwrite ) \
263305 _zend_hash_merge (target, source, pCopyConstructor, overwrite ZEND_FILE_LINE_CC)
264306
307+ //导出数组
308+ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable * source);
309+ ```
310+ ```c
265311#define zend_hash_sort(ht, compare_func, renumber) \
266312 zend_hash_sort_ex(ht, zend_sort, compare_func, renumber)
267313```
314+ 数组排序,compare_func为typedef int (* compare_func_t)(const void * , const void * ),需要自己定义比较函数,参数类型为Bucket* ,renumber表示是否更改键值,如果为1则会在排序后重新生成各元素的h。PHP中的sort()、rsort()、ksort()等都是基于这个函数实现的。
268315
269- #### 7.7.5.5 销毁数组
270-
316+ #### 7.7.5.7 销毁数组
317+ ``` c
318+ ZEND_API void ZEND_FASTCALL zend_array_destroy (HashTable * ht);
319+ ```
0 commit comments