最近被问到一个函数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函数实现的源码是:

 PHP_FUNCTION(count)
{
zval *array;
long mode = COUNT_NORMAL; //默认不递归查找元素个数
//获取两个参数
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &array, &mode) == FAILURE) {
return;
} switch (Z_TYPE_P(array)) {
case IS_NULL:
RETURN_LONG();//为空直接返回0
break;
case IS_ARRAY: //计算数组元素个数
RETURN_LONG (php_count_recursive (array, mode TSRMLS_CC));
break;
case IS_OBJECT: {
#ifdef HAVE_SPL
zval *retval;
#endif
/* first, we check if the handler is defined */
if (Z_OBJ_HT_P(array)->count_elements) {
RETVAL_LONG();
if (SUCCESS == Z_OBJ_HT(*array)->count_elements(array, &Z_LVAL_P(return_value) TSRMLS_CC)) {
return;
}
}
#ifdef HAVE_SPL //如果安装了 SPL
/* if not and the object implements Countable we call its count() method */
if (Z_OBJ_HT_P(array)->get_class_entry && instanceof_function(Z_OBJCE_P(array), spl_ce_Countable TSRMLS_CC)) {
zend_call_method_with_0_params(&array, NULL, NULL, "count", &retval);
if (retval) {
convert_to_long_ex(&retval);
RETVAL_LONG(Z_LVAL_P(retval));
zval_ptr_dtor(&retval);
}
return;
}
#endif
}
default://其他类型返回1
RETURN_LONG();
break;
}
}

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

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

当$mixed是null时,返回0

默认都是返回1

结论:

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

php count函数的更多相关文章

  1. [PHP源码阅读]count函数

    在PHP编程中,在遍历数组的时候经常需要先计算数组的长度作为循环结束的判断条件,而在PHP里面对数组的操作是很频繁的,因此count也算是一个常用函数,下面研究一下count函数的具体实现. 我在gi ...

  2. 在MySQL的InnoDB存储引擎中count(*)函数的优化

    写这篇文章之前已经看过了很多数据库方面的优化内容,大部分都是加索引.使用事务.要什么select什么等等.然而,只是停留在阅读的层面上,很少有实践,因为没有遇到真实的项目,一切都是纸上谈兵.实践是检验 ...

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

    用法 count() 函数返回数组中元素的数目. count(array,mode); [mode] 0 - 默认.不计算多维数组中的所有元素. 1 - 递归地计算数组中元素的数目(计算多维数组中的所 ...

  4. SQLServer count函数、cross apply和outer apply、

    1.COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)2.COUNT(*) 函数返回表中的记录数 select *   from TABLE_1 T1 outer ap ...

  5. 通过实现Countable接口来调用count函数

    周六我一大早就来到公司,还有些客户工作没有收尾,还有写文档没写,还有写计划需要完善,我得抓紧.到了下午我发现大家陆陆续续的都到公司来了,有几个兄弟一来就开始工作了,每当有人自愿投入某一项工作时,我基本 ...

  6. COUNT()函数的使用

    COUNT函数 让我们能够数出在表格中有多少笔资料被选出来.它的语法是: SELECT COUNT("栏位名")        FROM "表格名" 举例来说, ...

  7. PHP count() 函数

    count() 函数计算数组中的单元数目或对象中的属性个数. 对于数组,返回其元素的个数,对于其他值,返回 1.如果参数是变量而变量没有定义,则返回 0.如果 mode 被设置为 COUNT_RECU ...

  8. SQL COUNT() 函数

    COUNT() 函数返回匹配指定条件的行数. SQL COUNT() 语法 SQL COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL ...

  9. Mysql中Count函数的正确使用

    备注: 直接使用Count(*)或Count(1)这些大家基本都会,主要是Count函数还可以加满足表达式的统计:express 关于Count函数表达式的用法,目前个人只知道2种: a:使用:Cou ...

随机推荐

  1. 裸奔Spring(1)

    pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...

  2. shell命令快捷键

    在shell命令终端中,Ctrl+n相当于方向向下的方向键,Ctrl+p相当于方向向上的方向键.   在命令终端中通过它们或者方向键可以实现对历史命令的快速查找.这也是快速输入命令的技巧.   在命令 ...

  3. Windows IIS 安装配置PHP环境

    一. 概述 二.安装PHP 1.到php官网下载最新版PHP http://windows.php.net/download 三.配置IIS PHP环境

  4. Lua面向对象----类、继承、多继承、单例的实现

    (本文转载)学习之用,侵权立删! 原文地址   http://blog.csdn.net/y_23k_bug/article/details/19965877?utm_source=tuicool&a ...

  5. C语言运算符优先级和口诀(转)

    一共有十五个优先级: 1   ()  []  .  -> 2   !  ~   -(负号) ++  --   &(取变量地址)*   (type)(强制类型)    sizeof 3   ...

  6. closest应用(向上查找最近的资料)

    //新增网址信息function AddSitInfo(a) {    var obj = $(a).closest("td[name='POIRestaurant_Reference_UR ...

  7. JS验证输入网址

    function CheckUrl(a) {    var falg = true;    var regstr = /^http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- . ...

  8. XidianOJ 1020 ACMer去刷题吧

    题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...

  9. MVC开发基础

    新建--项目--ASP.NET MVC 4 WEB 应用程序 MVC: M--Model  模型层     放置数据访问类,linq V--View  视图层       界面层   aspx文件.只 ...

  10. Java学习基础2

    运算符: ++:  int a = 4;  int b = a++;    ++在后:先运算在递增1   输出:a=5  b=4;    int b = ++a;    ++在前:先递增1,再运算 输 ...