//替换数组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);
    }
}