PHP 提供豐富的陣列統計函數,其中 count()(及別名 sizeof())與 array_count_values() 是最常用的兩項。本文詳細解析其用法、差異、效能特性與實戰應用場景。
count(Countable|array $value, int $mode = COUNT_NORMAL): int
$value:目標陣列或實作 Countable 介面的物件$mode:COUNT_NORMAL(預設,不遞迴)或 COUNT_RECURSIVE(遞迴計算多維陣列)<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
echo count($arr); // 輸出: 5
echo sizeof($arr); // 輸出: 5 (別名函數)
// 多維陣列
$multi = [
'fruits' => ['apple', 'banana'],
'colors' => ['red', 'blue', 'green']
];
echo count($multi); // 輸出: 2 (第一層鍵數)
echo count($multi, COUNT_RECURSIVE); // 輸出: 7 (2 + 2 + 3)
?>
| 輸入 | 結果 | 說明 |
|---|---|---|
空陣列 [] | 0 | 正常回傳 |
| 未定義變數 | 0 + 警告 | PHP 7.2+ 拋出 Warning |
| null | 0 + 警告 | 建議先 is_array() 檢查 |
| 純量值 (字串/數字) | 1 + 警告 | 非 Countable 物件 |
function safeCount($var) {
return is_countable($var) ? count($var) : 0;
// PHP 7.3+ 可用 is_countable()
// 舊版用: is_array($var) || $var instanceof Countable
}
array_count_values(array $array): array
回傳關聯陣列:鍵 => 原始值, 值 => 出現次數
<?php
$array = [4, 5, 1, 2, 3, 1, 2, 1];
$ac = array_count_values($array);
print_r($ac);
/* 輸出:
Array
(
[4] => 1
[5] => 1
[1] => 3
[2] => 2
[3] => 1
)
*/
?>
$fruits = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
$stats = array_count_values($fruits);
/*
Array
(
[apple] => 3
[banana] => 2
[orange] => 1
)
*/
function findMode($array) {
if (empty($array)) return null;
$counts = array_count_values($array);
arsort($counts); // 依值降序排序,保持鍵關聯
return key($counts); // 回傳第一個鍵(出現最多次的值)
}
$data = [1, 2, 2, 3, 3, 3, 4];
echo findMode($data); // 輸出: 3
function hasDuplicates($array) {
$counts = array_count_values($array);
return max($counts) > 1;
}
function getDuplicates($array) {
$counts = array_count_values($array);
return array_filter($counts, fn($count) => $count > 1);
}
$test = ['a', 'b', 'c', 'a'];
var_dump(hasDuplicates($test)); // true
print_r(getDuplicates($test)); // ['a' => 2]
$scores = [85, 92, 78, 92, 85, 85, 90, 78, 95, 85];
$distribution = array_count_values($scores);
arsort($distribution);
foreach ($distribution as $score => $count) {
$bar = str_repeat('█', $count);
echo "{$score} 分: {$count} 人 {$bar}\n";
}
/* 輸出範例:
85 分: 4 人 ████
92 分: 2 人 ██
78 分: 2 人 ██
90 分: 1 人 █
95 分: 1 人 █
*/
sizeof 是 count 別名// 1. 分批處理大陣列
function chunkedCountValues($array, $chunkSize = 10000) {
$result = [];
foreach (array_chunk($array, $chunkSize) as $chunk) {
$partial = array_count_values($chunk);
foreach ($partial as $key => $count) {
$result[$key] = ($result[$key] ?? 0) + $count;
}
}
return $result;
}
// 2. 使用 Generator 避免記憶體峰值
function* countValuesGenerator($array) {
$counts = [];
foreach ($array as $value) {
$counts[$value] = ($counts[$value] ?? 0) + 1;
yield $value => $counts[$value]; // 即時產出
}
}
| 錯誤 | 原因 | 修正 |
|---|---|---|
count(null) 不檢查 | PHP 7.2+ 拋出 Warning | 先用 is_countable() 或 is_array() |
array_count_values() 處理多維陣列 | Warning: 值必須是純量 | 先扁平化 array_merge(...$multi) 或遞迴處理 |
混淆 count($arr, COUNT_RECURSIVE) 意義 | 計算所有層級元素總數,非子陣列個數 | 理解遞迴模式統計邏輯 |
對關聯陣列用 count() 判斷「是否為空」 | 邏輯正確但語義不清 | 建議用 empty($arr) 或 $arr === [] |
count() 與 array_count_values() 是 PHP 陣列統計的雙核心工具:
熟練掌握兩者配合使用(如先 count() 快速判斷空陣列,再 array_count_values() 深度分析),能高效解決資料統計、重複檢測、分布分析等常見需求。注意邊界條件處理與大資料量優化,是寫出健壯程式碼的關鍵。