<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 7.7.6 數組操作 #### 7.7.6.1 創建數組 創建一個新的HashTable分為兩步:首先是分配zend_array內存,這個可以通過`ZVAL_NEW_ARR()`宏分配,也可以自己直接分配;然后初始化數組,通過`zend_hash_init()`宏完成,如果不進行初始化數組將無法使用。 ```c #define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent) \ _zend_hash_init((ht), (nSize), (pDestructor), (persistent) ZEND_FILE_LINE_CC) ``` * __ht:__ 數組地址HashTable*,如果內部使用可以直接通過emalloc分配 * __nSize:__ 初始化大小,只是參考值,這個值會被對齊到2^n,最小為8 * __pHashFunction:__ 無用,設置為NULL即可 * __pDestructor:__ 刪除或更新數組元素時會調用這個函數對操作的元素進行處理,比如將一個字符串插入數組,字符串的refcount增加,刪除時不是簡單的將元素的Bucket刪除就可以了,還需要對其refcount進行處理,這個函數就是進行清理工作的 * __persistent:__ 是否持久化 示例: ```c zval array; uint32_t size; ZVAL_NEW_ARR(&array); zend_hash_init(Z_ARRVAL(array), size, NULL, ZVAL_PTR_DTOR, 0); ``` #### 7.7.6.2 插入、更新元素 數組元素的插入、更新主要有三種情況:key為zend_string、key為普通字符串、key為數值索引,相關的宏及函數: ```c // 1) key為zend_string //插入或更新元素,會增加key的refcount #define zend_hash_update(ht, key, pData) \ _zend_hash_update(ht, key, pData ZEND_FILE_LINE_CC) //插入或更新元素,當Bucket類型為indirect時,將pData更新至indirect的值,而不是更新Bucket #define zend_hash_update_ind(ht, key, pData) \ _zend_hash_update_ind(ht, key, pData ZEND_FILE_LINE_CC) //添加元素,與zend_hash_update()類似,不同的地方在于如果元素已經存在則不會更新 #define zend_hash_add(ht, key, pData) \ _zend_hash_add(ht, key, pData ZEND_FILE_LINE_CC) //直接插入元素,不管key存在與否,如果存在也不覆蓋原來元素,而是當做哈希沖突處理,所有會出現一個數組中key相同的情況,慎用!!! #define zend_hash_add_new(ht, key, pData) \ _zend_hash_add_new(ht, key, pData ZEND_FILE_LINE_CC) // 2) key為普通字符串:char* //與上面幾個對應,這里的key為普通字符串,會自動生成zend_string的key #define zend_hash_str_update(ht, key, len, pData) \ _zend_hash_str_update(ht, key, len, pData ZEND_FILE_LINE_CC) #define zend_hash_str_update_ind(ht, key, len, pData) \ _zend_hash_str_update_ind(ht, key, len, pData ZEND_FILE_LINE_CC) #define zend_hash_str_add(ht, key, len, pData) \ _zend_hash_str_add(ht, key, len, pData ZEND_FILE_LINE_CC) #define zend_hash_str_add_new(ht, key, len, pData) \ _zend_hash_str_add_new(ht, key, len, pData ZEND_FILE_LINE_CC) // 3) key為數值索引 //插入元素,h為數值 #define zend_hash_index_add(ht, h, pData) \ _zend_hash_index_add(ht, h, pData ZEND_FILE_LINE_CC) //與zend_hash_add_new()類似 #define zend_hash_index_add_new(ht, h, pData) \ _zend_hash_index_add_new(ht, h, pData ZEND_FILE_LINE_CC) //更新第h個元素 #define zend_hash_index_update(ht, h, pData) \ _zend_hash_index_update(ht, h, pData ZEND_FILE_LINE_CC) //使用自動索引值 #define zend_hash_next_index_insert(ht, pData) \ _zend_hash_next_index_insert(ht, pData ZEND_FILE_LINE_CC) #define zend_hash_next_index_insert_new(ht, pData) \ _zend_hash_next_index_insert_new(ht, pData ZEND_FILE_LINE_CC) ``` #### 7.7.6.3 查找元素 ```c //根據zend_string key查找數組元素 ZEND_API zval* ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key); //根據普通字符串key查找元素 ZEND_API zval* ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *key, size_t len); //獲取數值索引元素 ZEND_API zval* ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h); //判斷元素是否存在 ZEND_API zend_bool ZEND_FASTCALL zend_hash_exists(const HashTable *ht, zend_string *key); ZEND_API zend_bool ZEND_FASTCALL zend_hash_str_exists(const HashTable *ht, const char *str, size_t len); ZEND_API zend_bool ZEND_FASTCALL zend_hash_index_exists(const HashTable *ht, zend_ulong h); //獲取數組元素數 #define zend_hash_num_elements(ht) \ (ht)->nNumOfElements //與zend_hash_num_elements()類似,會有一些特殊處理 ZEND_API uint32_t zend_array_count(HashTable *ht); ``` #### 7.7.6.4 刪除元素 ```c //刪除key ZEND_API int ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key); //與zend_hash_del()類似,不同地方是如果元素類型為indirect則同時銷毀indirect的值 ZEND_API int ZEND_FASTCALL zend_hash_del_ind(HashTable *ht, zend_string *key); ZEND_API int ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char *key, size_t len); ZEND_API int ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const char *key, size_t len); ZEND_API int ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h); ZEND_API void ZEND_FASTCALL zend_hash_del_bucket(HashTable *ht, Bucket *p); ``` #### 7.7.6.5 遍歷 數組遍歷類似foreach的用法,在擴展中可以通過如下的方式遍歷: ```c zval *val; ZEND_HASH_FOREACH_VAL(ht, val) { ... } ZEND_HASH_FOREACH_END(); ``` 遍歷過程中會把數組元素賦值給val,除了上面這個宏還有很多其他用于遍歷的宏,這里列幾個比較常用的: ```c //遍歷獲取所有的數值索引 #define ZEND_HASH_FOREACH_NUM_KEY(ht, _h) \ ZEND_HASH_FOREACH(ht, 0); \ _h = _p->h; //遍歷獲取所有的key #define ZEND_HASH_FOREACH_STR_KEY(ht, _key) \ ZEND_HASH_FOREACH(ht, 0); \ _key = _p->key; //上面兩個的聚合 #define ZEND_HASH_FOREACH_KEY(ht, _h, _key) \ ZEND_HASH_FOREACH(ht, 0); \ _h = _p->h; \ _key = _p->key; //遍歷獲取數值索引key及value #define ZEND_HASH_FOREACH_NUM_KEY_VAL(ht, _h, _val) \ ZEND_HASH_FOREACH(ht, 0); \ _h = _p->h; \ _val = _z; //遍歷獲取key及value #define ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val) \ ZEND_HASH_FOREACH(ht, 0); \ _key = _p->key; \ _val = _z; #define ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _val) \ ZEND_HASH_FOREACH(ht, 0); \ _h = _p->h; \ _key = _p->key; \ _val = _z; ``` #### 7.7.6.6 其它操作 ```c //合并兩個數組,將source合并到target,overwrite為元素沖突時是否覆蓋 #define zend_hash_merge(target, source, pCopyConstructor, overwrite) \ _zend_hash_merge(target, source, pCopyConstructor, overwrite ZEND_FILE_LINE_CC) //導出數組 ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source); ``` ```c #define zend_hash_sort(ht, compare_func, renumber) \ zend_hash_sort_ex(ht, zend_sort, compare_func, renumber) ``` 數組排序,compare_func為typedef int (*compare_func_t)(const void *, const void *),需要自己定義比較函數,參數類型為Bucket*,renumber表示是否更改鍵值,如果為1則會在排序后重新生成各元素的h。PHP中的sort()、rsort()、ksort()等都是基于這個函數實現的。 #### 7.7.6.7 銷毀數組 ```c ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看