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
Позволяет выполнить более сложную логику подсчета, включая фильтрацию или группировку по условиям.
$items = ['a', 'b', 'a', 'c'];
$counts = array_reduce($items, function($carry, $item) {
$carry[$item] = ($carry[$item] ?? 0) + 1;
return $carry;
}, []);Обеспечивает максимальный контроль над процессом подсчета, позволяет обрабатывать элементы разных типов.
$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 оптимальна для простого подсчета строк и чисел. Ручные методы предпочтительнее при работе со смешанными типами или необходимости дополнительной обработки элементов.
Типичные ошибки
$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 улучшена диагностика: при передаче неподдерживаемых типов выводится более информативное предупреждение с указанием проблемного элемента.
Начиная с версии 7.3, функция демонстрирует стабильное поведение без значительных изменений в синтаксисе или возвращаемых значениях.
Расширенные примеры
$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
)$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%)
$logs = ['ERROR', 'INFO', 'ERROR', 'DEBUG', 'INFO', 'ERROR'];
$levels = array_count_values($logs);
// Фильтрация только ошибок
$errors = $levels['ERROR'] ?? 0;
echo "Количество ошибок: $errors";Количество ошибок: 3
// Генерация тестовых данных
$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
Аналоги в других языках
from collections import Counter
items = ['apple', 'banana', 'apple', 'orange']
result = Counter(items)
print(dict(result)){'apple': 2, 'banana': 1, 'orange': 1}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 }SELECT value, COUNT(*) as count
FROM table
GROUP BY value;Отличия: в Python Counter работает с любыми хешируемыми типами, в JavaScript подсчет требует ручной реализации, в MySQL подсчет выполняется на уровне базы данных.