This article mainly introduces the brief discussion on PHP source code 16: Regarding the array_count_values function, it has a certain reference value. Now I share it with you. Friends in need can refer to it.
Brief discussion on PHP source code 10 6: About the array_count_values function
array_count_values
(PHP 4, PHP 5)
array_count_values - Counts the number of occurrences of all values in the array
Description
array array_count_values (array input)
array_count_values() Returns an array that uses the value in the input array as the key name and the number of times the value appears in the input array as the value.
Source program description:
The two comments in the source code explain the implementation of this function
/* Initialize return array */ array_init(return_value); /* Go through input array and add values to the return array */
But there are some details that need to be paid attention to:
1. This function can only recognize strings and numbers, so the program uses statements similar to the following
if (Z_TYPE_PP(entry) == IS_LONG) {} else if (Z_TYPE_PP(entry) == IS_STRING) {} else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can only count STRING and INTEGER values!");}
2. During the traversal process, first determine whether it does not exist. This judgment process is based on strings and numbers. The numbers are also different, but in the end they are all operations on the hash table.
In the code, the macro zval *data; MAKE_STD_ZVAL(data);
is used to initialize zval in the code. The definition of tracking this macro is as follows:
MAKE_STD_ZVAL(data);==> #define MAKE_STD_ZVAL(zv) \ zend.h 586行 ALLOC_ZVAL(zv); \ INIT_PZVAL(zv); ==> #define ALLOC_ZVAL(z) \ ZEND_FAST_ALLOC(z, zval, ZVAL_CACHE_LIST) zend_alloc.h 165行 ==> #define ZEND_FAST_ALLOC(p, type, fc_type) \ (p) = (type *) emalloc(sizeof(type)) zend_alloc.h 152行 ==> #define emalloc(size) _emalloc((size) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC) zend_alloc.h 56行==> ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) zend_alloc.c 2288行 程序实现 ==> #define INIT_PZVAL(z) \ zend.h 576行 (z)->refcount = 1; \ (z)->is_ref = 0;
EOF
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 fifteen: About the array_walk function
A brief discussion on PHP source code fourteen: About array_combine function
A brief discussion on PHP source code 13: Introduction to array_change_key_case, array_chunk
The above is the detailed content of A brief discussion of PHP source code 16: About the array_count_values function. For more information, please follow other related articles on the PHP Chinese website!