Skip to content

Commit abf42e3

Browse files
committed
finish var
1 parent 724ae5d commit abf42e3

File tree

2 files changed

+56
-6
lines changed

2 files changed

+56
-6
lines changed

7/var.md

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -254,17 +254,66 @@ ZEND_API int ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const char *key,
254254
ZEND_API int ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h);
255255
ZEND_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+
```

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@
7070
* [7.7.1 新生成各类型zval](7/var.md)
7171
* [7.7.2 获取zval的值及类型](7/var.md)
7272
* [7.7.3 引用计数](7/var.md)
73-
* [7.7.4 数组操作](7/var.md)
73+
* [7.7.4 字符串操作](7/var.md)
74+
* [7.7.5 数组操作](7/var.md)
7475
* 7.8 常量
7576
* 7.9 面向对象
7677
* 7.6.1 扩展中创建对象

0 commit comments

Comments
 (0)