count_chars()
La fonction count_chars() compte le nombre d'occurrences de chaque caractère dans une chaîne et retourne un tableau ou une chaîne selon le mode choisi.
La fonction PHP count_chars() indique, pour chaque valeur d'octet possible (0 à 255), combien de fois elle apparaît dans une chaîne. Plutôt que d'examiner les mots ou les caractères un par un, elle fournit un instantané des fréquences de toute la chaîne en un seul appel. Elle est donc pratique pour des tâches telles que la construction d'histogrammes de caractères, la détection des caractères utilisés par une chaîne, ou le repérage rapide d'octets inattendus dans une entrée.
Cette page couvre la syntaxe, chaque valeur de $mode et ce qu'elle retourne exactement, un exemple concret, ainsi que les pièges courants (comme les clés ASCII et la gestion du texte multi-octets).
Syntaxe
count_chars(string $string, int $mode = 0): array|string$string— la chaîne à analyser.$mode— contrôle la forme du résultat (par défaut0). Voir les modes ci-dessous.
Les clés retournées par count_chars() sont des valeurs d'octet (0–255), pas les caractères eux-mêmes. Par exemple, l'octet 108 correspond à la lettre l. Utilisez chr() pour convertir une valeur d'octet en son caractère, et ord() pour faire l'inverse.
Les cinq modes
| Mode | Retourne |
|---|---|
0 | Un tableau pour les 256 valeurs d'octet, même celles qui n'apparaissent jamais (compte 0). |
1 | Un tableau contenant uniquement les octets qui apparaissent au moins une fois, indexé par valeur d'octet. |
2 | Un tableau contenant uniquement les octets qui n'apparaissent jamais (compte 0). |
3 | Une chaîne contenant chaque octet distinct utilisé, dans l'ordre croissant. |
4 | Une chaîne contenant chaque octet qui n'a pas été utilisé. |
Les modes 0, 1 et 2 retournent un tableau ; les modes 3 et 4 retournent une chaîne.
Exemple de base
Le mode 1 est celui que l'on utilise le plus souvent — il liste uniquement les caractères qui apparaissent réellement et combien de fois chacun le fait.
La sortie est :
Array
(
[32] => 1
[33] => 1
[44] => 1
[72] => 1
[87] => 1
[100] => 1
[101] => 1
[108] => 3
[111] => 2
[114] => 1
)Chaque clé est une valeur d'octet et chaque valeur est son compte. Ainsi, [108] => 3 signifie que l'octet 108 (la lettre l) apparaît trois fois, et [111] => 2 signifie que o apparaît deux fois. L'espace (32), la virgule (44) et le point d'exclamation (33) sont également comptés.
Obtenir une sortie lisible avec chr()
Comme les clés sont des valeurs d'octet, la sortie brute est difficile à lire. Convertissez chaque clé en son caractère avec 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);
}
?>Sortie :
' ' (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)Modes 3 et 4 : quels caractères sont (ou ne sont pas) utilisés
Lorsque vous vous intéressez uniquement à quels caractères apparaissent — et non au nombre de fois — les modes 3 et 4 retournent une chaîne compacte plutôt qu'un tableau.
<?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)
?>Le mode 3 est un moyen rapide d'obtenir l'ensemble des caractères distincts d'une chaîne, déjà triés.
Pièges courants
- Les clés sont des octets, pas des caractères. Rappellez-vous toujours que
count_chars()indexe par valeur d'octet 0–255. Associez-le àchr()pour une sortie lisible. - Il ne gère pas le multi-octets. Un caractère UTF-8 tel que
éest composé de deux octets, etcount_chars()comptera chaque octet séparément plutôt que le caractère dans son ensemble. Pour le texte Unicode, préférezmb_strlen()/preg_match_all(). - Le mode
0est volumineux. Il retourne toujours 256 entrées (la plupart avec un compte de0), utilisez donc le mode1lorsque vous souhaitez uniquement les caractères qui apparaissent.
Fonctions associées
strlen()— longueur totale d'une chaîne en octets.substr_count()— compte les occurrences d'une sous-chaîne (pas d'un seul octet).str_word_count()— compte les mots plutôt que les caractères.str_split()— divise une chaîne en un tableau de caractères.ord()etchr()— conversion entre un caractère et sa valeur d'octet.