This article mainly introduces the brief discussion on PHP source code 13: The introduction of array_change_key_case and array_chunk has a certain reference value. Now it is shared with everyone. Friends in need can refer to it.
Brief Discussion PHP source code 13: Introduction to array_change_key_case, array_chunk
array_change_key_case
(PHP 4 >= 4.2.0, PHP 5)
array_change_key_case — Return string key names in all lowercase Or an uppercase array
Description
array array_change_key_case (array input [, int case])
array_change_key_case() Changes all key names in the input array to all lowercase or uppercase. Changes are made based on the latter option case argument. Two constants can be used here, CASE_UPPER and CASE_LOWER. The default value is CASE_LOWER. This function does not change the numeric index.
Seeing this function, I think it should traverse the hash table where the array is located, and then convert its corresponding key value into uppercase or lowercase (if it is a string key value)
After reading it, there are some differences. The program is to add one to the reference of each array element
array_chunk
(PHP 4 >= 4.2.0, PHP 5)
array_chunk — Split an array into multiple
Description
array array_chunk (array input, int size [, bool preserve_keys])
array_chunk() splits an array into multiple arrays, where the number of cells in each array is determined by size . The last array may have a few fewer elements. The resulting array is a cell in a multidimensional array, with indexes starting from zero.
Set the optional parameter preserve_keys to TRUE to enable PHP to retain the original key names in the input array. If you specify FALSE, each result array will be indexed with a new number starting from zero. The default value is FALSE.
Program implementation instructions:
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); // 剩余的元素}
The above is the entire content of this article. I hope it will be helpful to everyone’s study. For more related content, please pay attention to the PHP Chinese website!
Related recommendations:
A brief discussion on PHP source code 12: About return_value Return value
A brief discussion on PHP source code 11 : Introduction to array_key_exists, in_array
A brief discussion on PHP source code ten: About array_keys, array_values functions
The above is the detailed content of A brief discussion of PHP source code 13: Introduction to array_change_key_case and array_chunk. For more information, please follow other related articles on the PHP Chinese website!