PHP 8.4.2 Released!

count

(PHP 4, PHP 5, PHP 7, PHP 8)

count统计数组、Countable 对象中所有元素的数量

说明

count(Countable|array $value, int $mode = COUNT_NORMAL): int

用于数组时,统计数组中元素的数量;用于实现了 Countable 接口的对象时,返回 Countable::count() 方法的返回值。

参数

value

数组或者 Countable 对象。

mode

如果可选的 mode 参数设为 COUNT_RECURSIVE(或 1),count() 将递归地对数组计数。对计算多维数组的所有单元尤其有用。

警告

count() 能检测递归来避免无限循环,但每次出现时会产生 E_WARNING 错误 (如果 array 不止一次包含了自身)并返回大于预期的统计数字。

返回值

返回 value 中的元素的数量。在 PHP 8.0.0 之前,如果参数既不是数组也不是实现了 Countable 接口的对象,将返回 1。当 valuenull 时返回 0

更新日志

版本 说明
8.0.0 value 参数传入了无效的 countable 类型, count() 现在会抛出 TypeError
7.2.0 value 参数传入了无效的 countable 类型, count() 现在会产生警告。

示例

示例 #1 count() 例子

<?php
$a
[0] = 1;
$a[1] = 3;
$a[2] = 5;
var_dump(count($a));

$b[0] = 7;
$b[5] = 9;
$b[10] = 11;
var_dump(count($b));
?>

以上示例会输出:

int(3)
int(3)

示例 #2 count() 非 Countable|array 的例子 (这是个反例,请勿模仿)

<?php
$b
[0] = 7;
$b[5] = 9;
$b[10] = 11;
var_dump(count($b));

var_dump(count(null));

var_dump(count(false));
?>

以上示例会输出:

int(3)
int(0)
int(1)

Output of the above example in PHP 7.2:

int(3)

Warning: count(): Parameter must be an array or an object that implements Countable in … on line 12
int(0)

Warning: count(): Parameter must be an array or an object that implements Countable in … on line 14
int(1)

以上示例在 PHP 8 中的输出:

int(3)

Fatal error: Uncaught TypeError: count(): Argument #1 ($var) must be of type Countable .. on line 12

示例 #3 递归 count() 例子

<?php
$food
= array('fruits' => array('orange', 'banana', 'apple'),
'veggie' => array('carrot', 'collard', 'pea'));

// 递归计数
var_dump(count($food, COUNT_RECURSIVE));

// 常规计数
var_dump(count($food));

?>

以上示例会输出:

int(8)
int(2)

示例 #4 Countable 对象

<?php
class CountOfMethods implements Countable
{
private function
someMethod()
{
}

public function
count(): int
{
return
count(get_class_methods($this));
}
}

$obj = new CountOfMethods();
var_dump(count($obj));
?>

以上示例会输出:

int(2)

参见

添加备注

用户贡献的备注 6 notes

up
143
onlyranga at gmail dot com
10 years ago
[Editor's note: array at from dot pl had pointed out that count() is a cheap operation; however, there's still the function call overhead.]

If you want to run through large arrays don't use count() function in the loops , its a over head in performance, copy the count() value into a variable and use that value in loops for a better performance.

Eg:

// Bad approach

for($i=0;$i<count($some_arr);$i++)
{
// calculations
}

// Good approach

$arr_length = count($some_arr);
for($i=0;$i<$arr_length;$i++)
{
// calculations
}
up
3
lucasfsmartins at gmail dot com
5 years ago
If you are on PHP 7.2+, you need to be aware of "Changelog" and use something like this:

<?php
$countFruits
= is_array($countFruits) || $countFruits instanceof Countable ? count($countFruits) : 0;
?>

You can organize your code to ensure that the variable is an array, or you can extend the Countable so that you don't have to do this check.
up
13
danny at dannymendel dot com
17 years ago
I actually find the following function more useful when it comes to multidimension arrays when you do not want all levels of the array tree.

// $limit is set to the number of recursions
<?php
function count_recursive ($array, $limit) {
$count = 0;
foreach (
$array as $id => $_array) {
if (
is_array ($_array) && $limit > 0) {
$count += count_recursive ($_array, $limit - 1);
} else {
$count += 1;
}
}
return
$count;
}
?>
up
2
Anonymous
5 years ago
For a Non Countable Objects

$count = count($data);
print "Count: $count\n";

Warning: count(): Parameter must be an array or an object that implements Countable in example.php on line 159

#Quick fix is to just cast the non-countable object as an array..

$count = count((array) $data);
print "Count: $count\n";

Count: 250
up
3
pied-pierre
9 years ago
A function of one line to find the number of elements that are not arrays, recursively :

function count_elt($array, &$count=0){
foreach($array as $v) if(is_array($v)) count_elt($v,$count); else ++$count;
return $count;
}
up
8
alexandr at vladykin dot pp dot ru
18 years ago
My function returns the number of elements in array for multidimensional arrays subject to depth of array. (Almost COUNT_RECURSIVE, but you can point on which depth you want to plunge).

<?php
function getArrCount ($arr, $depth=1) {
if (!
is_array($arr) || !$depth) return 0;

$res=count($arr);

foreach (
$arr as $in_ar)
$res+=getArrCount($in_ar, $depth-1);

return
$res;
}
?>
To Top