count_chars()
Функция count_chars() подсчитывает количество вхождений каждого символа в строке и возвращает результат в зависимости от выбранного режима.
Функция PHP count_chars() сообщает, сколько раз каждое возможное значение байта (от 0 до 255) встречается в строке. Вместо того чтобы анализировать слова или символы по одному, она за один вызов даёт снимок частот по всей строке. Это удобно для построения гистограмм символов, определения того, какие символы используются в строке, или быстрого обнаружения неожиданных байтов во входных данных.
На этой странице рассмотрены синтаксис, все значения $mode с описанием возвращаемых данных, рабочий пример и распространённые подводные камни (например, смысл ключей в виде ASCII-значений и поведение функции с многобайтовым текстом).
Синтаксис
count_chars(string $string, int $mode = 0): array|string$string— строка для анализа.$mode— определяет форму результата (по умолчанию0). Описание режимов см. ниже.
Ключи, возвращаемые count_chars(), — это значения байтов (0–255), а не сами символы. Например, байт 108 соответствует букве l. Используйте chr(), чтобы преобразовать значение байта обратно в символ, и ord() — для обратного преобразования.
Пять режимов
| Режим | Возвращает |
|---|---|
0 | Array для всех 256 значений байтов, включая те, которые ни разу не встречаются (счётчик 0). |
1 | Array только тех байтов, которые встречаются хотя бы один раз, с ключами в виде значений байтов. |
2 | Array только тех байтов, которые не встречаются ни разу (счётчик 0). |
3 | String, содержащий каждый отдельный использованный байт в порядке возрастания. |
4 | String, содержащий каждый байт, который не был использован. |
Режимы 0, 1 и 2 возвращают array; режимы 3 и 4 возвращают string.
Базовый пример
Режим 1 используется чаще всего — он перечисляет только те символы, которые реально встречаются, и указывает количество вхождений каждого.
Результат:
Array
(
[32] => 1
[33] => 1
[44] => 1
[72] => 1
[87] => 1
[100] => 1
[101] => 1
[108] => 3
[111] => 2
[114] => 1
)Каждый ключ — это значение байта, а каждое значение — количество вхождений. Так, [108] => 3 означает, что байт 108 (буква l) встречается три раза, а [111] => 2 — что буква o встречается дважды. Пробел (32), запятая (44) и восклицательный знак (33) тоже учитываются.
Получение читаемого вывода с помощью chr()
Поскольку ключи являются значениями байтов, необработанный вывод трудно читать. Преобразуйте каждый ключ обратно в символ с помощью 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);
}
?>Вывод:
' ' (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)Режимы 3 и 4: какие символы (не) используются
Когда вас интересует только какие символы присутствуют — а не сколько раз — режимы 3 и 4 возвращают компактную строку вместо 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)
?>Режим 3 — это быстрый способ получить набор уникальных символов строки в отсортированном виде.
Распространённые подводные камни
- Ключи — это байты, а не символы. Всегда помните, что
count_chars()индексирует по значению байта от 0 до 255. Используйтеchr()для читаемого вывода. - Функция не поддерживает многобайтовые символы. UTF-8 символ, например
é, занимает два байта, иcount_chars()подсчитает каждый байт отдельно, а не символ целиком. Для Unicode-текста предпочтительнее использоватьmb_strlen()/preg_match_all(). - Режим
0возвращает большой массив. Он всегда содержит 256 элементов (большинство со счётчиком0), поэтому используйте режим1, если вас интересуют только встречающиеся символы.
Связанные функции
strlen()— общая длина строки в байтах.substr_count()— подсчёт вхождений подстроки (не одного байта).str_word_count()— подсчёт слов, а не символов.str_split()— разбивка строки на array символов.ord()иchr()— преобразование между символом и его значением байта.