count_chars()
La función count_chars() cuenta las ocurrencias de cada carácter en una cadena y devuelve un array o string según el modo especificado.
La función count_chars() de PHP informa, para cada posible valor de byte (0 a 255), cuántas veces aparece en una cadena. En lugar de analizar palabras o caracteres uno a uno, ofrece un resumen de frecuencias de toda la cadena en una sola llamada. Esto resulta útil para tareas como construir histogramas de caracteres, detectar qué caracteres usa una cadena o identificar rápidamente bytes inesperados en una entrada.
Esta página cubre la sintaxis, cada $mode y exactamente qué devuelve cada uno, un ejemplo práctico y los errores comunes (como las claves ASCII y el manejo de texto multibyte).
Sintaxis
count_chars(string $string, int $mode = 0): array|string$string— la cadena a analizar.$mode— controla la forma del resultado (por defecto0). Consulta los modos a continuación.
Las claves devueltas por count_chars() son valores de byte (0–255), no los caracteres en sí. Por ejemplo, el byte 108 es la letra l. Usa chr() para convertir un valor de byte a su carácter, y ord() para hacer lo contrario.
Los cinco modos
| Modo | Devuelve |
|---|---|
0 | Un array con los 256 valores de byte, incluso los que nunca aparecen (cuenta 0). |
1 | Un array con solo los bytes que aparecen al menos una vez, indexado por valor de byte. |
2 | Un array con solo los bytes que nunca aparecen (cuenta 0). |
3 | Un string que contiene cada byte distinto utilizado, en orden ascendente. |
4 | Un string que contiene cada byte que no fue utilizado. |
Los modos 0, 1 y 2 devuelven un array; los modos 3 y 4 devuelven un string.
Ejemplo básico
El modo 1 es el que se usa con más frecuencia: lista solo los caracteres que realmente aparecen y cuántas veces lo hace cada uno.
La salida es:
Array
(
[32] => 1
[33] => 1
[44] => 1
[72] => 1
[87] => 1
[100] => 1
[101] => 1
[108] => 3
[111] => 2
[114] => 1
)Cada clave es un valor de byte y cada valor es su conteo. Así, [108] => 3 significa que el byte 108 (la letra l) aparece tres veces, y [111] => 2 significa que o aparece dos veces. El espacio (32), la coma (44) y el signo de exclamación (33) también se cuentan.
Obtener salida legible con chr()
Como las claves son valores de byte, la salida sin procesar es difícil de leer. Convierte cada clave a su carácter con chr():
<?php
$string = "Hello, World!";
foreach (count_chars($string, 1) as $byte => $times) {
printf("'%s' (byte %d) appears %d time(s)\n", chr($byte), $byte, $times);
}
?>Salida:
' ' (byte 32) appears 1 time(s)
'!' (byte 33) appears 1 time(s)
',' (byte 44) appears 1 time(s)
'H' (byte 72) appears 1 time(s)
'W' (byte 87) appears 1 time(s)
'd' (byte 100) appears 1 time(s)
'e' (byte 101) appears 1 time(s)
'l' (byte 108) appears 3 time(s)
'o' (byte 111) appears 2 time(s)
'r' (byte 114) appears 1 time(s)Modos 3 y 4: qué caracteres se usan (o no)
Cuando solo te importa qué caracteres aparecen —no cuántas veces—, los modos 3 y 4 devuelven un string compacto en lugar de un array.
<?php
$string = "Hello, World!";
echo count_chars($string, 3) . "\n"; // !,HWdelor
echo strlen(count_chars($string, 3)) . "\n"; // 10 (10 distinct bytes used)
echo strlen(count_chars($string, 4)) . "\n"; // 246 (256 - 10 = bytes never used)
?>El modo 3 es una forma rápida de obtener el conjunto de caracteres distintos en una cadena, ya ordenados.
Errores comunes
- Las claves son bytes, no caracteres. Recuerda siempre que
count_chars()indexa por valor de byte 0–255. Combínalo conchr()para obtener una salida legible. - No tiene soporte multibyte. Un carácter UTF-8 como
éocupa dos bytes, ycount_chars()contará cada byte por separado en lugar del carácter completo. Para texto Unicode, es preferible usarmb_strlen()/preg_match_all(). - El modo
0es extenso. Siempre devuelve 256 entradas (la mayoría con cuenta0), así que usa el modo1cuando solo quieras los caracteres que aparecen.
Funciones relacionadas
strlen()— longitud total de una cadena en bytes.substr_count()— cuenta las ocurrencias de una subcadena (no de un solo byte).str_word_count()— cuenta palabras en lugar de caracteres.str_split()— divide una cadena en un array de caracteres.ord()ychr()— convierten entre un carácter y su valor de byte.