W3docs

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() — для обратного преобразования.

Пять режимов

РежимВозвращает
0Array для всех 256 значений байтов, включая те, которые ни разу не встречаются (счётчик 0).
1Array только тех байтов, которые встречаются хотя бы один раз, с ключами в виде значений байтов.
2Array только тех байтов, которые не встречаются ни разу (счётчик 0).
3String, содержащий каждый отдельный использованный байт в порядке возрастания.
4String, содержащий каждый байт, который не был использован.

Режимы 0, 1 и 2 возвращают array; режимы 3 и 4 возвращают string.

Базовый пример

Режим 1 используется чаще всего — он перечисляет только те символы, которые реально встречаются, и указывает количество вхождений каждого.

php— editable, runs on the server

Результат:

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() — преобразование между символом и его значением байта.

Практика

Практика
Что делает функция PHP 'count_chars()'?
Что делает функция PHP 'count_chars()'?
Was this page helpful?