2024年PHP开发者大会日本站

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(如果数组包含自身多次)并返回一个可能高于预期的计数。

返回值

返回value中元素的数量。在PHP 8.0.0之前,如果参数既不是array也不是实现Countable接口的object,则将返回1,除非valuenull,在这种情况下将返回0

变更日志

版本 描述
8.0.0 count()现在将在传递给value参数的无效可计数类型上抛出TypeError
7.2.0 count()现在将在传递给value参数的无效可计数类型上产生警告。

示例

示例 #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)

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 条笔记

onlyranga at gmail dot com
10年前
[编辑注:来自 dot pl 的 array 指出 count() 是一个廉价的操作;但是,仍然存在函数调用的开销。]

如果要遍历大型数组,不要在循环中使用 count() 函数,它会降低性能。将 count() 值复制到一个变量中,并在循环中使用该变量以提高性能。

例如

// 不好的方法

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

// 好的方法

$arr_length = count($some_arr);
for($i=0;$i<$arr_length;$i++)
{
// 计算
}
lucasfsmartins at gmail dot com
5年前
如果您使用的是 PHP 7.2 或更高版本,您需要了解“变更日志”并使用类似以下代码:

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

您可以组织代码以确保变量为数组,或者您可以扩展 Countable 接口,这样您就不必进行此检查。
danny at dannymendel dot com
17年前
当处理多维数组并且不想遍历数组树的所有层级时,我发现以下函数更有用。

// $limit 设置为递归次数
<?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;
}
?>
匿名用户
5年前
对于不可计数的对象

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

警告:count(): 参数必须是数组或实现 Countable 接口的对象 in example.php on line 159

#快速的解决方法是将不可计数的对象强制转换为数组。

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

Count: 250
pied-pierre
9年前
一个单行函数,用于递归查找不是数组的元素数量

function count_elt($array, &$count=0){
foreach($array as $v) if(is_array($v)) count_elt($v,$count); else ++$count;
return $count;
}
alexandr at vladykin dot pp dot ru
18年前
我的函数返回多维数组中元素的数量,该数量取决于数组的深度。(几乎与 COUNT_RECURSIVE 相同,但您可以指定要深入到的深度)。

<?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