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);
}
}
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);
}
}
相关阅读 更多 +
排行榜 更多 +