1 PHP_FUNCTION(array_change_key_case)
2 {
3 zval *array, *entry;
4 zend_string *string_key;
5 zend_string *new_key;
6 zend_ulong num_key;
7 zend_long change_to_upper=0;
8
9 if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|l", &array, &change_to_upper) == FAILURE) {
10 return;
11 }
12
13 array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL_P(array)));
14
15 ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_key, string_key, entry) {
16 if (!string_key) { // 数组键值为数字索引,将数组元素更新到return_value
17 entry = zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, entry);
18 } else { // 数组键值为字符串
19 // 字符串键值大小写转换
20 if (change_to_upper) {
21 new_key = php_string_toupper(string_key);
22 } else {
23 new_key = php_string_tolower(string_key);
24 }
25 // 将数组元素更新到return_value
26 entry = zend_hash_update(Z_ARRVAL_P(return_value), new_key, entry);
27 // 释放zend_string, 如果引用数位0,则释放内存。
28 zend_string_release(new_key);
29 }
30 // 增加引用
31 zval_add_ref(entry);
32 } ZEND_HASH_FOREACH_END();
33 }