Home  >  Article  >  Backend Development  >  A brief discussion of PHP source code 16: About the array_count_values ​​function

A brief discussion of PHP source code 16: About the array_count_values ​​function

不言
不言Original
2018-06-28 17:31:322437browse

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn