Menu

PHP count():获取数组长度

count($arr) 返回 PHP 数组中的元素个数,所以 count(['a', 'b', 'c']) 是 3。本文讲解如何用 COUNT_RECURSIVE 统计嵌套数组、sizeof() 和 count() 的关系、如何统计符合条件的值,以及为什么从 PHP 8 开始 count(null) 会抛出 TypeError。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

count($arr) 返回数组中的元素个数:count(['red', 'green', 'blue']) 是 3。PHP 数组没有 length 属性,所以要获取数组的长度或大小,就用 count()。

count() 很快:PHP 把数组的大小存在数组内部,所以统计一百万个元素和统计三个元素的开销是一样的。

统计多维数组

默认情况下,count() 只统计最外层。把 COUNT_RECURSIVE(或 1)作为第二个参数传入,就能统计每一层的每个元素。嵌套的数组本身也会被计入,所以总数往往比叶子值的个数要多。

这两种简便写法都假设数组正好有两层。对于嵌套更深的多维数组,用 array_walk_recursive() 统计叶子值:$n = 0; array_walk_recursive($arr, function () use (&$n) { $n++; });。

count 与 sizeof

sizeof() 是 count() 的别名:参数相同,结果也相同。请使用 count()。几乎所有 PHP 代码和文档都用它,而对熟悉 C 语言的人来说,sizeof 会让人以为是以字节为单位的大小。

统计符合条件的值

count() 没有条件参数。先过滤,再计数:array_filter() 会保留回调函数接受的元素。要统计每个值出现了多少次,使用 array_count_values()。

统计字符串中的字符

count() 是用于数组的。对于字符串,用 strlen() 获取字节数,用 mb_strlen() 获取字符数;一旦文本中有带重音符号的字母或中文,两者的结果就会不同。strlen 页面讲解了其中的区别。要统计单词数,先把字符串拆开。

str_word_count() 会把非 ASCII 字母当作分隔符,所以 naïve 会被算成两个单词。对于真实文本,按空格拆分的结果更可预测。

对 null 或字符串调用 count() 会抛出异常

从 PHP 8 开始,count() 只接受数组和实现了 Countable 的对象。其他任何值都会抛出 TypeError,而在 PHP 7.2 到 7.4 中,它会返回 0(对于 null)或 1(对于字符串或数字),并给出一条警告。常见原因是某个变量有时是 null,比如缺失的键,或者一个什么也没返回的函数。

用 ?? 给它一个空数组作为默认值,计数结果就是 0:

检查数组是否为空

要判断“这个数组里有没有东西”,可以和空数组比较,或者使用 empty()。count($arr) === 0 也可以,但前提是 $arr 一定是数组。

即使 $x 未定义或为 null,empty($x) 也永远不会抛出异常,所以对于可能不是数组的值,它是更安全的检查方式。它的其他规则(空字符串和 "0" 也算空)见 empty 页面。

常见问题

PHP 中怎么获取数组的长度?

使用 count($arr)。它以整数返回元素个数,所以 count([10, 20, 30]) 是 3。PHP 数组没有 length 属性。

PHP 中 count 和 sizeof 有什么区别?

没有区别。sizeof() 是 count() 的别名,参数也完全相同。大多数代码使用 count(),而 sizeof() 可能会误导熟悉 C 语言的读者,因为在 C 中它表示字节数。

怎么统计多维数组的元素个数?

count($arr) 只统计最外层。count($arr, COUNT_RECURSIVE) 会统计每一层的每个元素,嵌套的数组本身也算作元素。

为什么 PHP 8 中 count() 会抛出 TypeError?

从 PHP 8.0 开始,count() 只接受数组和实现了 Countable 的对象。count(null) 会抛出 TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given,count('abc') 也一样,只是变成 string given。对于可能为 null 的值,使用 count($x ?? []);对于字符串,使用 strlen()。

Coddy 编程语言插图

和 Coddy 一起学编程

开始