int count ( mixed $array_or_countable [, int $mode = COUNT_NORMAL ] )
count函数打算数组或者工具里面的所有元素个数。
对付工具来说,如果你安装了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
数字和字符串
$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);