<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之旅 廣告
                ## 前言 這次,我們將演示如何在PHP擴展中如何對數組進行處理。要實現的PHP代碼如下: ``` <?php function array_concat ($arr, $prefix) { foreach($arr as $key => $val) { if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) { $arr[$key] = $prefix[$key].$val; } } return $arr; } $arr = array( 0 => '0', 1 => '123', 'a' => 'abc', ); $prefix = array( 1 => '456', 'a' => 'def', ); var_dump(array_concat($arr, $prefix)); ?> ``` 把兩個數組,相同key的字符串值拼接。 ## 代碼 ### 基礎代碼 這個擴展,我們將在say擴展上增加 `array_concat` 方法。say擴展相關代碼大家請看這篇博文。PHP7擴展開發之hello word 文中已經詳細介紹了如何創建一個擴展和提供了源碼下載。 ### 實現array_concat方法 array_concat方法的PHP擴展源碼: ```c PHP_FUNCTION(array_concat) { zval *arr, *prefix, *entry, *prefix_entry, value; zend_string *string_key, *result; zend_ulong num_key; if (zend_parse_parameters(ZEND_NUM_ARGS(), "aa", &arr, &prefix) == FAILURE) { return; } array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL_P(arr))); ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(arr), num_key, string_key, entry) { if (string_key && zend_hash_exists(Z_ARRVAL_P(prefix), string_key)) { prefix_entry = zend_hash_find(Z_ARRVAL_P(prefix), string_key); if (Z_TYPE_P(entry) == IS_STRING && prefix_entry != NULL && Z_TYPE_P(prefix_entry) == IS_STRING) { result = strpprintf(0, "%s%s", Z_STRVAL_P(prefix_entry), Z_STRVAL_P(entry)); ZVAL_STR(&value, result); zend_hash_update(Z_ARRVAL_P(return_value), string_key, &value); } } else if (string_key == NULL && zend_hash_index_exists(Z_ARRVAL_P(prefix), num_key)){ prefix_entry = zend_hash_index_find(Z_ARRVAL_P(prefix), num_key); if (Z_TYPE_P(entry) == IS_STRING && prefix_entry != NULL && Z_TYPE_P(prefix_entry) == IS_STRING) { result = strpprintf(0, "%s%s", Z_STRVAL_P(prefix_entry), Z_STRVAL_P(entry)); ZVAL_STR(&value, result); zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, &value); } } else if (string_key) { zend_hash_update(Z_ARRVAL_P(return_value), string_key, entry); zval_add_ref(entry); } else { zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, entry); zval_add_ref(entry); } }ZEND_HASH_FOREACH_END(); } ``` ## 代碼說明 PHP中的數組本質上就是一個哈希。 對于哈希處理的方法主要集中在[Zend/zend_hash.h](https://github.com/php/php-src/blob/master/Zend/zend_hash.h)中。 對于數組的操作方法主要集中在[Zend/zend_API.h](https://github.com/php/php-src/blob/master/Zend/zend_API.h)。數組的方法其實就是對哈希處理方法的一層包裝。 數組操作的方法主要是以`add_assoc_` 和 `add_index_`開頭的一些列方法。 下面是代碼中涉及的一些方法。 `zend_hash_num_elements`獲取數組的元素個數。 `array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL_P(arr))); ` 初始化一個數組。在PHP擴展中,我們是通過`return_value`這個變量設置方法的返回值。因此,我們直接修改這個`return_value`變量即可。感興趣的話,可以把宏方法`PHP_FUNCTION`展開看下。 PHP7提供了一套宏方法用于遍歷哈希和對哈希進行操作。這些宏方法主要放在[Zend/zend_hash.h](https://github.com/php/php-src/blob/master/Zend/zend_hash.h)文件中。如,代碼中的`ZEND_HASH_FOREACH_KEY_VAL`就是一個變量哈希的宏。是不是和PHP代碼中的foreach有點像? 在這里我們把代碼中用到的哈希相關的方法做下整理說明: `ZEND_HASH_FOREACH_KEY_VAL` 和 `ZEND_HASH_FOREACH_END` 配合使用,實現foreach的效果。 * `zend_hash_exists` 檢測指定的key在哈希中是否存在。key為字符串。 * `zend_hash_index_exists` 檢測指定的key在哈希中是否存在。key為數字。 * `zend_hash_find` 根據key查找指定的值。key為字符串。 * `zend_hash_index_find` 根據key查找指定的值。key為數字。 * `zend_hash_update `更新指定key的值。key為字符串。 * `zend_hash_index_update` 更新指定key的值。key為數字。 基本上有這些方法,你就可以對數組進行一些基本操作了。方法命名也很有規律,key為字符串和數字提供了兩套。 `zval_add_ref(entry);` 給數組的值,增加一次引用計數。`zend_hash_update`方法只自動給`string_key`自動增加了一次引用計數。數組`return_value`共用數組`arr`的值。因此,我們需要手動增加一次引用計數。 PHP7哈希相關的文章大家可以看看 http://jpauli.github.io/2016/04/08/hashtables.html
                  <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>

                              哎呀哎呀视频在线观看