php 求数组个数字,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 caseIS_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 caseIS_OBJECT: {18 #ifdef HAVE_SPL19 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上面了解的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值