php count函数

最近被问到一个函数count

1、count("123456") 对应的输出是什么?

2、count(null) 对应的输出是什么?

以前没有认真的考虑,只是心里有一个印象那就是count()函数是计算php数组的个数的。后来下来仔细看了看手册,原来发现:

1、count函数是统计数组里所有元素的个数或者对象的属性的个数的,函数原型如下:

int count(mixed $var[, $mode=COUNT_NORMAL);

对于对象,如果安装了SPL,可以通过Countable接口调用count,该接口只有一个Countable::count(),此函数返回count的返回值。

2、当设置$mode=1时,会递归对数组进行计算,但是识别不了无限递归。

3、当$var不是array或者object(实现了Countalbe::count函数)时:

count函数将返回1,但当$mixed=null 时,将返回0

count函数实现的源码是:

 1 PHP_FUNCTION(count)
 2 {
 3         zval *array;
 4         long mode = COUNT_NORMAL; //默认不递归查找元素个数
 5        //获取两个参数
 6         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &array, &mode) == FAILURE) {
 7                 return;
 8         }
 9
10         switch (Z_TYPE_P(array)) {
11                 case IS_NULL:
12                         RETURN_LONG(0);//为空直接返回0
13                         break;
14                 case IS_ARRAY:         //计算数组元素个数
15                         RETURN_LONG (php_count_recursive (array, mode TSRMLS_CC));
16                         break;
17                 case IS_OBJECT: {
18 #ifdef HAVE_SPL
19                         zval *retval;
20 #endif
21                         /* first, we check if the handler is defined */
22                         if (Z_OBJ_HT_P(array)->count_elements) {
23                                 RETVAL_LONG(1);
24                                 if (SUCCESS == Z_OBJ_HT(*array)->count_elements(array, &Z_LVAL_P(return_value) TSRMLS_CC)) {
25                                         return;
26                                 }
27                         }
28 #ifdef HAVE_SPL //如果安装了 SPL
29                         /* if not and the object implements Countable we call its count() method */
30                         if (Z_OBJ_HT_P(array)->get_class_entry && instanceof_function(Z_OBJCE_P(array), spl_ce_Countable TSRMLS_CC)) {
31                                 zend_call_method_with_0_params(&array, NULL, NULL, "count", &retval);
32                                 if (retval) {
33                                         convert_to_long_ex(&retval);
34                                         RETVAL_LONG(Z_LVAL_P(retval));
35                                         zval_ptr_dtor(&retval);
36                                 }
37                                 return;
38                         }
39 #endif
40                 }
41                 default://其他类型返回1
42                         RETURN_LONG(1);
43                         break;
44         }
45 }

以上可以看出,调用count函数时,当$mixed为数组时会调用php_count_recursive 函数

(php_count_recursive,当不是递归获取元素个数时,返回数组的nNumOfElements,时间复杂度为N(1),只有mode=1时才会递归计算元素个数);

当$mixed是null时,返回0

默认都是返回1

结论:

想了解一些PHP函数的时候还是多看看PHP手册,以前主要是通过W3C上面了解的。

时间: 2024-12-13 08:17:50

php count函数的相关文章

php count()函数用法 及其 一个坑

用法 count() 函数返回数组中元素的数目. count(array,mode); [mode] 0 - 默认.不计算多维数组中的所有元素. 1 - 递归地计算数组中元素的数目(计算多维数组中的所有元素). 坑 单纯的判断count($array)>0来判断数组是否存在是不严谨的因为有可能 $array = '';echo (count($array)); 输出1;

TSql Count 函数三种写法介绍

Count常见的有三种写法,count(*),count(expression),count(column_name) Count(expression) ,count(column_name)计数的机制是:计算 expression,或表中column_name的值是否为NULL,如果为NULL则不计数,如果不是NULL则会计数. count(*),返回表中行的数目.Specifies that all rows should be counted to return the total nu

【SAS ADVANCE】通过COUNT函数实现counting values及HAVING子句

一. COUNT函数 在实际统计应用中,需要计算观测值出现的次数,这项功能可以通过COUNT函数来实现,它有下面三种形式和功能: form you used 返回值 例子 COUNT(*) 整个表或组的行数   select count(*) as Count COUNT(column) 当参数中所选定的列没有缺失值时,输出表或者组中该变量的行数   select count(jobcode) as Count COUNT(DISTINCT column) 该列中distinct values的

COUNT()函数的使用

COUNT函数 让我们能够数出在表格中有多少笔资料被选出来.它的语法是: SELECT COUNT("栏位名")        FROM "表格名" 举例来说,若我们要找出我们的示范表格中有几笔 store_name 栏不是空白的资料时,Store_Information 表格 store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 Los Angeles $300

[PHP源码阅读]count函数

在PHP编程中,在遍历数组的时候经常需要先计算数组的长度作为循环结束的判断条件,而在PHP里面对数组的操作是很频繁的,因此count也算是一个常用函数,下面研究一下count函数的具体实现. 我在github上有对PHP源码更详细的注解.感兴趣的可以围观一下,给个star.PHP5.4源码注解.可以通过commit记录查看已添加的注解. count int count ( mixed $array_or_countable [, int $mode = COUNT_NORMAL ] ) coun

C++ STL之count函数

谓词(predicate):是做某些检测的函数,返回用于条件判断的类型,指出条件是否成立. 总结: count : 在序列中统计某个值出现的次数 count_if : 在序列中统计与某谓词匹配的次数 count和count_if函数是计数函数,先来看一下count函数:count函数的功能是:统计容器中等于value元素的个数. 先看一下函数的参数:count(first,last,value); first是容器的首迭代器,last是容器的末迭代器,value是询问的元素. 可能我说的不太详细

COUNT()函数

COUNT() 函数返回匹配指定条件的行数. COUNT(column_name)函数返回指定列的值的数目(NULL不计入) SELECT COUNT(column_name) FROM table_name; COUNT(*) 函数返回表中的记录数: SELECT COUNT(*) FROM table_name; 例: 从SC表中选出S=1的数量 select count(*) from SC where S=1 选择SC表中列S下不同的值的数量 select count(*) from (

oracle,sql server count函数 存储过程 判断 行数 注意事项

oralce中使用 count 函数判断 行数 需要注意 一定是count 有值的字段,接下来看一组语句 1 --查询数据 2 select * from kk_create_ka where auto_id='D7313B4716AD4062B82D3CD8513DA7A8'; 1 --count 2 select count(I_E_Flag) from kk_create_ka where auto_id='D7313B4716AD4062B82D3CD8513DA7A8'; 3 sele

mysql中的count()函数

1.count()函数是用来统计表中记录的一个函数,返回匹配条件的行数. 2.count()语法: (1)count(*)---包括所有列,返回表中的记录数,相当于统计表的行数,在统计结果的时候,不会忽略列值为NULL的记录. (2)count(1)---忽略所有列,1表示一个固定值,也可以用count(2).count(3)代替,在统计结果的时候,不会忽略列值为NULL的记录. (3)count(列名)---只包括列名指定列,返回指定列的记录数,在统计结果的时候,会忽略列值为NULL的记录(不