Array count values: примеры (PHP)

Подсчет значений массива с array_count_values в PHP
Раздел: Работа с массивами
array_count_values(array $array): array

Функция array_count_values в PHP

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

Синтаксис и аргументы
array_count_values(array $array): array

Единственный параметр $array — массив, значения которого будут подсчитываться. Функция работает только со значениями типов string и int. При передаче значений других типов возникает предупреждение, и такие элементы игнорируются.

Область применения

Функция используется для частотного анализа данных: подсчета повторяющихся элементов, анализа текстов, обработки результатов опросов, статистики посещений или любых задач, требующих определения частоты встречаемости значений.

Базовые примеры использования

Подсчет строковых значений
$colors = ['red', 'blue', 'red', 'green', 'blue', 'blue'];
$result = array_count_values($colors);
print_r($result);
Array
(
    [red] => 2
    [blue] => 3
    [green] => 1
)
Подсчет целочисленных значений
$numbers = [1, 2, 1, 3, 2, 1, 1];
$result = array_count_values($numbers);
print_r($result);
Array
(
    [1] => 4
    [2] => 2
    [3] => 1
)
Смешанные типы данных
$data = [1, 'apple', 1, 'apple', 2, 'banana'];
$result = array_count_values($data);
print_r($result);
Array
(
    [1] => 2
    [apple] => 2
    [2] => 1
    [banana] => 1
)

Альтернативы в PHP

array_reduce с ручным подсчетом

Позволяет выполнить более сложную логику подсчета, включая фильтрацию или группировку по условиям.

$items = ['a', 'b', 'a', 'c'];
$counts = array_reduce($items, function($carry, $item) {
    $carry[$item] = ($carry[$item] ?? 0) + 1;
    return $carry;
}, []);
Цикл foreach

Обеспечивает максимальный контроль над процессом подсчета, позволяет обрабатывать элементы разных типов.

$items = ['x', 'y', 'x'];
$counts = [];
foreach ($items as $item) {
    if (is_string($item) || is_int($item)) {
        $counts[$item] = ($counts[$item] ?? 0) + 1;
    }
}
array_count_values vs альтернативы

array_count_values оптимальна для простого подсчета строк и чисел. Ручные методы предпочтительнее при работе со смешанными типами или необходимости дополнительной обработки элементов.

Типичные ошибки

Неподдерживаемые типы данных
$data = [1, 2.5, [3], null];
$result = array_count_values($data);
Warning: array_count_values(): Can only count string and integer values, entry skipped
Отсутствие проверки возвращаемого значения
$emptyArray = [];
$result = array_count_values($emptyArray);
// Попытка использовать результат как массив без проверки
echo $result['missing'] ?? 'Not found';
Not found
Путаница с ключами и значениями
$data = ['1', 1]; // Строка '1' и число 1 - разные значения
$result = array_count_values($data);
print_r($result);
Array
(
    [1] => 2 // Оба значения приводятся к строке '1'
)

Изменения в версиях PHP

PHP 8.0: улучшенные сообщения об ошибках

В PHP 8.0 улучшена диагностика: при передаче неподдерживаемых типов выводится более информативное предупреждение с указанием проблемного элемента.

PHP 7.3: стабильность работы

Начиная с версии 7.3, функция демонстрирует стабильное поведение без значительных изменений в синтаксисе или возвращаемых значениях.

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

Анализ текста
Пример php
$text = "apple banana apple cherry banana apple";
$words = explode(' ', $text);
$wordCount = array_count_values($words);
arsort($wordCount); // Сортировка по убыванию частоты
print_r($wordCount);
Array
(
    [apple] => 3
    [banana] => 2
    [cherry] => 1
)
Подсчет результатов голосования
Пример php
$votes = ['Yes', 'No', 'Yes', 'Abstain', 'Yes', 'No', 'Yes'];
$results = array_count_values($votes);
$total = array_sum($results);
foreach ($results as $option => $count) {
    $percentage = round($count / $total * 100, 2);
    echo "$option: $count ($percentage%)\n";
}
Yes: 4 (57.14%)
No: 2 (28.57%)
Abstain: 1 (14.29%)
Обработка логов
Пример php
$logs = ['ERROR', 'INFO', 'ERROR', 'DEBUG', 'INFO', 'ERROR'];
$levels = array_count_values($logs);
// Фильтрация только ошибок
$errors = $levels['ERROR'] ?? 0;
echo "Количество ошибок: $errors";
Количество ошибок: 3
Работа с большими массивами
Пример php
// Генерация тестовых данных
$data = array_map(fn($n) => rand(1, 10), range(1, 10000));
$start = microtime(true);
$counts = array_count_values($data);
$time = microtime(true) - $start;
echo "Подсчет 10000 элементов: {$time} секунд\n";
echo "Самое частое значение: " . array_search(max($counts), $counts);
Подсчет 10000 элементов: 0.0012 секунд
Самое частое значение: 7

Аналоги в других языках

Python: Counter из collections
from collections import Counter
items = ['apple', 'banana', 'apple', 'orange']
result = Counter(items)
print(dict(result))
{'apple': 2, 'banana': 1, 'orange': 1}
JavaScript: ручная реализация
const items = ['a', 'b', 'a', 'c'];
const result = {};
items.forEach(item => {
    result[item] = (result[item] || 0) + 1;
});
console.log(result);
{ a: 2, b: 1, c: 1 }
MySQL: GROUP BY и COUNT
SELECT value, COUNT(*) as count
FROM table
GROUP BY value;

Отличия: в Python Counter работает с любыми хешируемыми типами, в JavaScript подсчет требует ручной реализации, в MySQL подсчет выполняется на уровне базы данных.

PHP array_count_values function comments

En
Array count values Counts all the values of an array