1

Count chars: примеры (PHP)

Использование count_chars для анализа строк в PHP
Раздел: Работа со строками
count_chars(string $string, int $mode = 0): array|string

Описание функции count_chars

Назначение функции

Функция count_chars() в языке PHP анализирует строку и возвращает статистику о частоте использования байтов (символов) в ней. Она применяется для анализа текстовых данных, проверки наличия определенных символов, задач криптографии или простой верификации ввода.

Аргументы функции

Функция принимает два аргумента:

  • $string (обязательный) – строка для анализа.
  • $mode (опциональный, по умолчанию 0) – целое число от 0 до 4, определяющее формат возвращаемого результата:
    • 0 – возвращает массив, где ключами являются ASCII-коды (0..255), а значениями – количество соответствующих символов в строке.
    • 1 – аналогично 0, но возвращаются только символы с частотой больше нуля.
    • 2 – аналогично 0, но возвращаются только символы с частотой, равной нулю.
    • 3 – возвращает строку, содержащую все уникальные символы из исходной строки.
    • 4 – возвращает строку, содержащую все символы, которые не встречались в исходной строке.

Функция работает именно с байтами, поэтому корректно обрабатывает только однобайтовые кодировки, например, ASCII или ISO-8859-1. Для многобайтовых строк (UTF-8) результат может быть некорректен.

Краткие примеры использования

Режим 0: все символы
$str = "Hello!";
$result = count_chars($str, 0);
print_r($result);
Array
(
    [72] => 1  // 'H'
    [101] => 1 // 'e'
    [108] => 2 // 'l'
    [111] => 1 // 'o'
    [33] => 1  // '!'
    // остальные ключи от 0 до 255 со значением 0
)
Режим 1: только использованные символы
$str = "aaabb";
$result = count_chars($str, 1);
print_r($result);
Array
(
    [97] => 3 // 'a'
    [98] => 2 // 'b'
)
Режим 3: строка уникальных символов
$str = "apple";
$result = count_chars($str, 3);
echo $result;
aelp
Проверка наличия символа
$str = "Test123";
$stats = count_chars($str, 1);
if (isset($stats[ord('1')])) {
    echo "Цифра '1' найдена.";
}
Цифра '1' найдена.
Похожие функции в PHP

Функция substr_count() подсчитывает количество вхождений подстроки в строку. Используется, когда нужно найти частоту не отдельных символов, а целых фрагментов.

array_count_values()

Функция array_count_values() подсчитывает частоту всех значений в массиве. Для анализа символов строки потребуется предварительно разбить строку на массив с помощью str_split(). Этот способ может быть полезен для работы с многобайтовыми строками в сочетании с mb_str_split().

strlen() и сравнения

Для простых проверок, например, отсутствия определенных символов, иногда достаточно функций strlen() и strspn()/strcspn().

Типичные ошибки
Неверная интерпретация байтов

Основная ошибка — использование функции для многобайтовых строк (например, UTF-8). Функция анализирует байты, а не Unicode-символы.

$str = "Привет"; // UTF-8, кириллица
$result = count_chars($str, 1);
print_r($result);
// Выведет статистику по отдельным байтам, 
// а не по буквам 'П', 'р' и т.д. Результат будет неожиданным.
Ожидание строки от режимов 1 и 2

Режимы 1 и 2 возвращают ассоциативные массивы, а не строки.

$str = "abc";
$result = count_chars($str, 1);
echo $result; // Попытка вывести массив как строку
Warning: Array to string conversion
Array
Использование несуществующего режима
$str = "test";
$result = count_chars($str, 10); // Недопустимый режим
Warning: count_chars(): Unknown mode
Изменения в последних версиях PHP

В PHP 8.0 функция count_chars() не претерпела значительных изменений в сигнатуре или основном поведении. Однако, как и многие другие функции, в строгом режиме она может генерировать более точные типы ошибок. В PHP 8.1 и 8.2 существенных изменений для этой функции также не зафиксировано. Рекомендуется следить за официальной документацией на случай появления нововведений, связанных с обработкой строк и кодировок.

Расширенные примеры

Построение гистограммы символов
Пример php
function buildHistogram($string) {
    $freq = count_chars($string, 1);
    echo "Гистограмма символов:\n";
    foreach ($freq as $ascii => $count) {
        echo chr($ascii) . ": " . str_repeat('#', $count) . " ($count)\n";
    }
}
buildHistogram("PHP is fun!");
Гистограмма символов:
 : ## (2)
!: # (1)
P: # (1)
H: # (1)
f: # (1)
i: # (1)
n: # (1)
s: # (1)
u: # (1)
Проверка на печатные ASCII-символы
Пример php
function hasOnlyPrintable($string) {
    // Режим 4 возвращает символы, которых не было в строке.
    // Если строка состояла только из печатных символов (32-126),
    // то в отсутствующих не должно быть печатных.
    $missing = count_chars($string, 4);
    for ($i = 32; $i <= 126; $i++) {
        if (strpos($missing, chr($i)) !== false) {
            // Найден отсутствующий печатный символ — это нормально.
            // Нас интересуют НЕпечатные в исходной строке.
        }
    }
    // Проверим, есть ли в строке символы с кодом < 32 или > 126
    $all = count_chars($string, 0);
    for ($i = 0; $i < 32; $i++) {
        if ($all[$i] > 0) return false;
    }
    for ($i = 127; $i <= 255; $i++) {
        if ($all[$i] > 0) return false;
    }
    return true;
}
var_dump(hasOnlyPrintable("Hello!")); // true
var_dump(hasOnlyPrintable("Hello!\n")); // false из-за \n (код 10)
bool(true)
bool(false)
Сравнение двух строк по набору символов
Пример php
function haveSameChars($str1, $str2) {
    // Получаем строки уникальных символов и сравниваем
    return count_chars($str1, 3) === count_chars($str2, 3);
}
var_dump(haveSameChars("listen", "silent"));
var_dump(haveSameChars("apple", "pale"));
bool(true)
bool(false) // во второй строке нет символа 'p'? На самом деле есть. 
// Функция вернет true, так как набор символов одинаков. 
// Но порядок в строке от count_chars отсортирован по коду ASCII.
Аналоги в других языках

Count chars в Python

В Python аналогичную статистику можно получить с помощью модуля collections.Counter или метода строки count() для отдельных символов. Counter работает с любыми итерируемыми объектами и поддерживает Unicode.

from collections import Counter
text = "Hello!"
counter = Counter(text)
print(counter)
print(counter['l'])
Counter({'l': 2, 'H': 1, 'e': 1, 'o': 1, '!': 1})
2

Count chars в Javascript

В JavaScript нет встроенной функции для полной статистики символов. Для получения частоты символов обычно используют объект или Map, перебирая строку.

let str = "Hello!";
let freq = {};
for (let char of str) {
    freq[char] = (freq[char] || 0) + 1;
}
console.log(freq);
console.log(freq['l']);
{ H: 1, e: 1, l: 2, o: 1, '!': 1 }
2

Count chars в MySQL

В MySQL прямой аналог отсутствует. Для подсчета конкретного символа можно использовать разницу длин строк: CHAR_LENGTH(column) - CHAR_LENGTH(REPLACE(column, 'a', '')).

SELECT 
  CHAR_LENGTH('banana') - CHAR_LENGTH(REPLACE('banana', 'a', '')) 
  AS count_a;
count_a: 3

PHP count_chars function comments

En
Count chars Return information about characters used in a string