count

int count ( mixed $array_or_countable [, int $mode = COUNT_NORMAL ] )

count函数打算数组或者工具里面的所有元素个数。

php数组countPHP源码浏览count函数 GraphQL

对付工具来说,如果你安装了SPL扩展,可以通过实现Countable接口来调用count函数。
Countable接口有且仅有一个方法Countable::count(),该方法的返回count()函数的返回值。

参数解释

mode

如果参数mode设为COUNT_RECURSIVE(或1),count()会递归地皮算该数组。
在打算多维数组的时候特殊有用。

如果第一个参数不是数组或者实现Countable接口的工具,count函数将返回1。

把稳:count函数可以检测递归避免无限循环,但会在碰着无限递归或得到比期望值大的时候返回E_WARNING提示。

运行示例

普通运用

$arr1 = array(1,2,3,4,5);

$val1 = count($arr1);// 5

多维数组

$arr2 = array('apple','banana',array('cat','camel'),'dog');

$val2_1 = count($arr2);// 4

$val2_2 = count($arr2,1);// 6

数字和字符串

$str = \"大众hello world\公众;

$int_val = 1;

$val3 = count($str);// 1

$val4 = count($int_val);// 1

普通工具

classUser{

private$name;

private$address;

}

$user = newUser();

$val5 = count($user);// 1

$val6 = count((array)$user);// 2

array-like工具

classUserextendsArrayObject{

private$name;

publicfunction__construct(){

$this->name = 'hhq';

}

publicfunctiongetName(){

return$this->name;

}

publicfunctioncount(){

return2;

}

}

$user2 = newUser();

$val7 = count($user2);// 2

实现Countable接口工具

classUserimplementsCountable{

publicfunctioncount(){

return3;

}

}

$user3 = newUser();

$val8 = count($user3);// 3

运行步骤

进入switch语句检测参数类型

如果是NULL,直接返回0

如果是数组,调用php_count_recursive函数机选数组元素个数

如果是工具,先检讨是否为数组工具(array-like object),如果是,则打算数组工具的数量

否则,如果工具实现了Countable接口,则调用Countable的count方法

末了,其他类型比如整型数组或字符串,都返回1。

源码解读

如果是普通数组,count函数会调用php_count_recursive函数实现其功能的运行步骤如下:

如果当前hash Bucket被递归访问的次数大于1,解释重复递归,染回E_WARNING缺点

否则打算当前数组层数的数组元素个数

如果有递归参数选项,则连续递归访问

如果参数是工具类型,实现时会先判断handler是否被定义。
而handler是PHP内核中工具的构造体,个中包含有count_elements字段,实际上是一个函数。
如果某个工具表现得想数组一样,即常日说的array-like object,那么就会实行count_elements函数。
详细实现是类继续PHP的ArrayObject,并在类里面实现count函数,详细调用的便是count函数,如果类没有实现count函数,则count返回0,否则返回工具的count函数的返回值。

如果是其他的数据类型

1、字符串

2、数字

3、工具分支中两个if判断都为false的情形,即没有继续ArrayObject且没有实现Countable接口。

这些类型通通返回1。

须要把稳的是,如果须要打算的是工具的属性数量,可以先将工具转换成数组,然后调用count函数。
如: $count_value = count((array) $user);