PHP内置函数分析之array_change_key_case
作者 斯人 | 发布于 2012 年 2 月 26 日
PHP PHP内核

array_change_key_case 是数组的一个函数

它的作用 是返回所有键名全部为大写或者小写的数组

array_change_key_case(array input[,int case]);
该函数接受两个参数 返回input的键名全部为大写或小写的数组,
case两个选项,
CASE_UPPER:大写
CASE_LOWER:小写
注意 本函数不改变数字索引.

PHP实例

<?php
$array=array("FirSt" => 1, "SecOnd" => 4);
$newarray=array_change_key_case($array,CASE_UPPER);
print_r($newarray);
$newarray=array_change_key_case($array,CASE_LOWER);
print_r($newarray);
?>

Array
(
[FIRST] => 1
[SECOND] => 4
)
Array
(
[first] => 1
[second] => 4
)
函数作用明白之后,我们看看PHP实现.

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;
        }
//如果要从扩展函数里面返回一个数组,那就必须首先对预定义变量 return_value (return_value 是我们导出函数中的一个预定义参数,用来存储返回值)使用一下 array_init() 函数。这里array_init_size是array_init的变形
        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:
                                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(new_key);
                                break;
                }    
                //移动到数组的下一个元素
                zend_hash_move_forward_ex(Z_ARRVAL_P(array), &pos);
        }
}
原文出处:http://www.imsiren.com/archives/268