PHP源码阅读笔记十三:array_change_key_case,array_chunk

PHP源码阅读笔记十三:array_change_key_case,array_chunk
array_change_key_case

(PHP 4 >= 4.2.0, PHP 5)
array_change_key_case — 返回字符串键名全为小写或大写的数组
说明

array array_change_key_case ( array input [, int case] )

array_change_key_case() 将 input 数组中的所有键名改为全小写或大写。改变是根据后一个选项 case 参数来进行的。可以在这里用两个常量,CASE_UPPER 和 CASE_LOWER。默认值是 CASE_LOWER。本函数不改变数字索引。
看到这个函数,觉得应该是遍历数组所在的hash table,然后将其对应的key值转换成大写或小写(如果是字符串弄的key值)
看完后有一些不同,程序是将每个数组元素的引用都有加一

array_chunk
(PHP 4 >= 4.2.0, PHP 5)
array_chunk — 将一个数组分割成多个
说明

array array_chunk ( array input, int size [, bool preserve_keys] )

array_chunk() 将一个数组分割成多个数组,其中每个数组的单元数目由 size 决定。最后一个数组的单元数目可能会少几个。得到的数组是一个多维数组中的单元,其索引从零开始。
将可选参数 preserve_keys 设为 TRUE,可以使 PHP 保留输入数组中原来的键名。如果你指定了 FALSE,那每个结果数组将用从零开始的新数字索引。默认值是 FALSE。

程序实现说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
array_init(return_value);    //    初始化返回值 数组
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(input), &pos);
while (zend_hash_get_current_data_ex(Z_ARRVAL_P(input), (void**)&entry, &pos) == SUCCESS) {    //    遍历HASH TABLE
/* 如果不存在,则创建并初始化chunk */
if (!chunk) {
MAKE_STD_ZVAL(chunk);
array_init(chunk);
}
/* 给数组元素的引用加一,相当于 *entry->refcount++; */
zval_add_ref(entry);
if (preserve_keys) {    //    保留键值
key_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(input), &str_key,
&str_key_len, &num_key, 0, &pos);    //    取元素的key值类型,此值是要所元素的nKeyLength属性判断
 
if (key_type == HASH_KEY_IS_STRING) {    //    字符串类型
add_assoc_zval_ex(chunk, str_key, str_key_len, *entry);
} else {
add_index_zval(chunk, num_key, *entry);
}
} else {
add_next_index_zval(chunk, *entry);    //    给返回的子数组添加元素
}
 
if (!(++current % size)) {    //    如果达到分割的界限,则将分割出来创建的子数组添加到返回数组中,并将子数组置为NULl
add_next_index_zval(return_value, chunk);
chunk = NULL;
}
zend_hash_move_forward_ex(Z_ARRVAL_P(input), &pos);    //    下一个元素
}
if (chunk) {
add_next_index_zval(return_value, chunk);    //    剩余的元素
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>