count($arr) devuelve el número de elementos de un array: count(['red', 'green', 'blue']) es 3. Los arrays de PHP no tienen una propiedad length, así que count() es la forma de obtener la longitud o el tamaño de un array.
count() es rápido: PHP guarda el tamaño dentro del array, así que contar un millón de elementos cuesta lo mismo que contar tres.
Contar un array multidimensional
Por defecto, count() cuenta solo el nivel superior. Pasa COUNT_RECURSIVE (o 1) como segundo argumento para contar todos los elementos de todos los niveles. Los propios arrays anidados también se cuentan, y por eso el total suele ser mayor que el número de valores finales.
Los dos atajos suponen exactamente dos niveles. Para un anidamiento más profundo en un array multidimensional, cuenta las hojas con array_walk_recursive(): $n = 0; array_walk_recursive($arr, function () use (&$n) { $n++; });.
count vs sizeof
sizeof() es un alias de count(): mismos argumentos, mismo resultado. Usa count(). Es lo que usan casi todo el código y la documentación de PHP, y sizeof sugiere un tamaño en bytes a cualquiera que conozca C.
Contar los valores que cumplen una condición
count() no tiene un argumento de condición. Filtra primero y luego cuenta: array_filter() conserva los elementos que acepta tu callback. Para contar cuántas veces aparece cada valor, usa array_count_values().
Contar caracteres de una cadena
count() es para arrays. Para una cadena, usa strlen() para los bytes o mb_strlen() para los caracteres; dan resultados distintos en cuanto el texto tiene tildes o japonés. La página de strlen explica la diferencia. Para contar palabras, divide primero.
str_word_count() trata las letras no ASCII como separadores, así que naïve cuenta como dos palabras. Dividir por los espacios es más predecible con texto real.
count() con null o con una cadena lanza un error
Desde PHP 8, count() solo acepta arrays y objetos que implementan Countable. Cualquier otra cosa lanza un TypeError, cuando PHP 7.2 a 7.4 devolvían 0 (para null) o 1 (para una cadena o un número) con un warning. La causa habitual es una variable que a veces es null, como una clave que falta o una función que no devolvió nada.
Usa un array vacío por defecto con ??, y el total es 0:
Comprobar si un array está vacío
Para preguntar "¿este array tiene algo?", compáralo con un array vacío o usa empty(). count($arr) === 0 también funciona, pero solo cuando $arr es seguro que es un array.
empty($x) nunca lanza un error, aunque $x no esté definida o sea null, lo que la convierte en la comprobación más segura para un valor que puede no ser un array. Sus otras reglas (una cadena vacía y "0" también están vacías) están en la página de empty.
Preguntas frecuentes
¿Cómo obtengo la longitud de un array en PHP?
Usa count($arr). Devuelve el número de elementos como entero, así que count([10, 20, 30]) es 3. Los arrays de PHP no tienen una propiedad length.
¿Cuál es la diferencia entre count y sizeof en PHP?
Ninguna. sizeof() es un alias de count() y acepta los mismos argumentos. La mayoría del código usa count(), y sizeof() puede confundir a quien conoce C, donde significa bytes.
¿Cómo cuento los elementos de un array multidimensional?
count($arr) cuenta solo el nivel superior. count($arr, COUNT_RECURSIVE) cuenta todos los elementos de todos los niveles, y los propios arrays anidados también cuentan como elementos.
¿Por qué count() lanza un TypeError en PHP 8?
Desde PHP 8.0, count() solo acepta arrays y objetos que implementan Countable. count(null) lanza TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given, y count('abc') lo mismo con string given. Usa count($x ?? []) para un valor que puede ser null, y strlen() para cadenas.