array_count_values函数实现

来源:互联网 发布:classic动作数据下载 编辑:程序博客网 时间:2024/06/06 19:06

函数array_count_values的实现:

<?php$array = array(1, "hello", 1, "world", "hello");print_r(array_count_values($array));?>

调用内部函数如下:

PHP_FUNCTION(array_count_values)  //统计数组中所有值出现的次数{    zval    *input,     /* Input array */            *entry,     /* An entry in the input array */  //输入的数组中的元素            *tmp;    HashTable *myht;    if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &input) == FAILURE) {  //zend_parse_parameters函数返回success或者FAILURE        return;    }    /* Initialize return array */    array_init(return_value);   //初始化一个作为放返回结果的数组    /* Go through input array and add values to the return array */    myht = Z_ARRVAL_P(input);  //把输入的数组中的元素放到hashtable中    ZEND_HASH_FOREACH_VAL(myht, entry) {   //遍历这个hahtable        ZVAL_DEREF(entry);        if (Z_TYPE_P(entry) == IS_LONG) {  //判断里面的元素是不是IS_LONG类型            if ((tmp = zend_hash_index_find(Z_ARRVAL_P(return_value), Z_LVAL_P(entry))) == NULL) {   //在返回的结果数组中查找这个数字,函数返回一个zval结果的值,是一个*retval                zval data;                  ZVAL_LONG(&data, 1);  //将&data所指的zval设置为IS_LONG类型,值是l                zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_P(entry), &data);  //返回结果数组中加一条并且value为1            } else {                Z_LVAL_P(tmp)++;  //如果不为空,这个值就要加一            }        } else if (Z_TYPE_P(entry) == IS_STRING) {  //如果里面的值是字符串            if ((tmp = zend_symtable_find(Z_ARRVAL_P(return_value), Z_STR_P(entry))) == NULL) {  //在返回结果这个数组中查找是否有这个字符串                zval data;                ZVAL_LONG(&data, 1);                zend_symtable_update(Z_ARRVAL_P(return_value), Z_STR_P(entry), &data);            } else {                Z_LVAL_P(tmp)++;            }        } else {            php_error_docref(NULL, E_WARNING, "Can only count STRING and INTEGER values!");  //报错,值只能是数字或者字符串类型        }    } ZEND_HASH_FOREACH_END();  //结束循环}
1 0
原创粉丝点击