@@ -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