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) результат может быть некорректен.
Краткие примеры использования
$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
)$str = "aaabb";
$result = count_chars($str, 1);
print_r($result);Array
(
[97] => 3 // 'a'
[98] => 2 // 'b'
)$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' найдена.
Функция substr_count() подсчитывает количество вхождений подстроки в строку. Используется, когда нужно найти частоту не отдельных символов, а целых фрагментов.
Функция array_count_values() подсчитывает частоту всех значений в массиве. Для анализа символов строки потребуется предварительно разбить строку на массив с помощью str_split(). Этот способ может быть полезен для работы с многобайтовыми строками в сочетании с mb_str_split().
Для простых проверок, например, отсутствия определенных символов, иногда достаточно функций strlen() и strspn()/strcspn().
Основная ошибка — использование функции для многобайтовых строк (например, UTF-8). Функция анализирует байты, а не Unicode-символы.
$str = "Привет"; // UTF-8, кириллица
$result = count_chars($str, 1);
print_r($result);// Выведет статистику по отдельным байтам, // а не по буквам 'П', 'р' и т.д. Результат будет неожиданным.
Режимы 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 8.0 функция count_chars() не претерпела значительных изменений в сигнатуре или основном поведении. Однако, как и многие другие функции, в строгом режиме она может генерировать более точные типы ошибок. В PHP 8.1 и 8.2 существенных изменений для этой функции также не зафиксировано. Рекомендуется следить за официальной документацией на случай появления нововведений, связанных с обработкой строк и кодировок.
Расширенные примеры
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)
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)
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})
2Count 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 }
2Count 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