Понимание функции PHP "array_count_values"
Функция array_count_values в PHP подсчитывает количество вхождений каждого значения в array и возвращает ассоциативный array.
Функция PHP array_count_values() подсчитывает, сколько раз каждое значение встречается в array. Она возвращает новый ассоциативный array, в котором ключами являются уникальные значения из входного array, а значениями — количество вхождений каждого из них. Это самый быстрый способ построить таблицу частот (гистограмму значений) без написания цикла вручную.
В этой главе рассматриваются синтаксис, правила подсчёта значений, типичные подводные камни и практические рецепты, например поиск наиболее часто встречающегося элемента.
Синтаксис
array_count_values(array $array): array| Параметр | Описание |
|---|---|
$array | Входной array, значения которого нужно подсчитать. Подсчитываются только значения типов int и string. |
Функция возвращает ассоциативный array пар значение => количество. Она не изменяет исходный array.
Базовый пример
Передайте array значений, и вы получите каждое уникальное значение вместе с его количеством:
Вывод:
Array
(
[red] => 2
[green] => 1
[blue] => 2
[yellow] => 1
)"red" и "blue" встречаются по два раза, а "green" и "yellow" — по одному. Исходные ключи array полностью игнорируются — имеют значение только сами значения.
Взаимодействие целочисленных и строковых ключей
Поскольку ключи PHP array могут быть только целыми числами или string, array_count_values() подсчитывает только значения типов int и string. Из этого вытекает один тонкий момент: числовая string вроде "1" и целое число 1 трактуются как один и тот же ключ, поэтому они подсчитываются вместе.
<?php
$mixed = array(1, "1", 1, "hello", "hello");
print_r(array_count_values($mixed));
?>Вывод:
Array
(
[1] => 3
[hello] => 2
)Целое число 1 и string "1" сливаются в единый ключ 1 со значением 3. Это отражает то, как PHP нормализует ключи array повсеместно.
Значения, которые нельзя подсчитать
Любое значение, не являющееся int или string — null, boolean, числа с плавающей точкой, array или object — не может использоваться как ключ. PHP пропускает его и выдаёт предупреждение вместо подсчёта:
<?php
$values = array("a", "b", null, 3.5, "a");
print_r(@array_count_values($values));
?>Вывод:
Array
(
[a] => 2
[b] => 1
)Подсчитываются только string-значения; null и число с плавающей точкой 3.5 отбрасываются (реальный вызов выдаёт предупреждения "Can only count string and integer values" — @ здесь используется лишь для чистоты вывода в примере). Если вам нужно подсчитывать другие типы, приведите или отфильтруйте данные заранее.
Практический рецепт: поиск наиболее часто встречающегося значения
Таблица частот делает тривиальным поиск моды (наиболее распространённого элемента). Отсортируйте количества по убыванию и возьмите первый ключ:
<?php
$votes = array("yes", "no", "yes", "yes", "no", "maybe");
$counts = array_count_values($votes);
arsort($counts); // sort by count, highest first, keeping keys
$winner = array_key_first($counts);
echo "Winner: $winner ({$counts[$winner]} votes)";
?>Вывод:
Winner: yes (3 votes)Вы также можете передать результат напрямую в array_sum(), чтобы подтвердить итоговое число, или в max(), чтобы получить максимальное количество.
Подсчёт слов в строке
Распространённый вариант использования — построение карты частотности слов. Разбейте строку на слова с помощью explode(), затем выполните подсчёт:
<?php
$text = "the cat sat on the mat the cat ran";
$words = explode(" ", $text);
print_r(array_count_values($words));
?>Вывод:
Array
(
[the] => 3
[cat] => 2
[sat] => 1
[on] => 1
[mat] => 1
[ran] => 1
)Когда использовать
Используйте array_count_values() везде, где вам нужна гистограмма значений: подсчёт голосов, поиск дубликатов, построение облаков тегов или обнаружение наиболее/наименее распространённых элементов. Это быстрее и нагляднее, чем ручной цикл foreach с проверками isset(), и устраняет частый источник ошибок «на единицу».
Связанные функции
array_unique()— удаление дублирующихся значений (когда важно только какие значения существуют, а не сколько раз они встречаются).array_keys()— извлечение уникальных значений после их преобразования в ключи.array_sum()— суммирование количеств.arsort()— сортировка полученной таблицы частот по количеству.