文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>array.cn array_change_key_case源码分析

array.cn array_change_key_case源码分析

时间:2011-06-13  来源:Jason-zy

//替换数组key程大写
PHP_FUNCTION(array_change_key_case)
{
    zval *array, **entry;
    char *string_key;
    char *new_key;
    uint str_key_len;
    ulong num_key;
    long change_to_upper=0;
    HashPosition pos;
    //参数解析
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|l", &array, &change_to_upper) == FAILURE) {
        return;
    }
    //初始化新数组 长度是传入数组的参数 *不信一切外来数据【我觉得可以不要这么麻烦呵呵】*
    array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL_P(array)));
    //指针指向传入数组的头部
    zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(array), &pos);
    //获取数据
    while (zend_hash_get_current_data_ex(Z_ARRVAL_P(array), (void **)&entry, &pos) == SUCCESS) {
        
        zval_add_ref(entry);
        //活动Key类型
        switch (zend_hash_get_current_key_ex(Z_ARRVAL_P(array), &string_key, &str_key_len, &num_key, 0, &pos)) {
            case HASH_KEY_IS_LONG:
                //数字类型无需转换 
                zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, entry, sizeof(entry), NULL);
                break;
            case HASH_KEY_IS_STRING:
                //estrndup:该函数能够分配len+1个字节的内存并且从string_key处复制len个字节到最新分配的块
                new_key = estrndup(string_key, str_key_len - 1);
                if (change_to_upper) {
                    php_strtoupper(new_key, str_key_len - 1);
                } else {
                    php_strtolower(new_key, str_key_len - 1);
                }
                zend_hash_update(Z_ARRVAL_P(return_value), new_key, str_key_len, entry, sizeof(entry), NULL);
                //efree"释放
                efree(new_key);
                break;
        }

        zend_hash_move_forward_ex(Z_ARRVAL_P(array), &pos);
    }
}
相关阅读 更多 +
排行榜 更多 +
谷歌卫星地图免费版下载

谷歌卫星地图免费版下载

生活实用 下载
谷歌卫星地图免费版下载

谷歌卫星地图免费版下载

生活实用 下载
kingsofpool官方正版下载

kingsofpool官方正版下载

赛车竞速 下载