統計陣列元素頻率並取 Top N,是資料分析、推薦系統、日誌聚合常見需求。本文提供一個 mostRepeatedValues() 函數:array_count_values 計頻 → arsort 降序保持鍵關聯 → array_slice 取前 N,並處理空陣列、非陣列輸入、型別敏感等邊界情況。
5, '值B' => 3, ...]
// 2. 按次數降序排序,保持鍵關聯
arsort($counts);
// 3. 限制返回數量
if ($limit > 0) {
$counts = array_slice($counts, 0, $limit, true); // true 保持鍵
}
return $counts;
}
// 測試
$data = [1, 1, 1, 54, 3, 4, 3, 4, 3, 14, 3, 4, 3, 7, 8, 9, 12, 45, 66, 5, 7, 8, 9, 2, 45];
$result = mostRepeatedValues($data, 5);
print_r($result);
/*
Array
(
[3] => 5 ← 數字 3 出現 5 次 (最多)
[4] => 3 ← 數字 4 出現 3 次
[1] => 3 ← 數字 1 出現 3 次
[9] => 2
[45] => 2
)
*/
| 函數 | 作用 | 關鍵特性 |
|---|---|---|
array_count_values() | 統計值頻率 | 鍵為原值 (需為 scalar: int/string),值為次數。非 scalar 會拋 Warning 並跳過。 |
arsort() | 降序排序保持鍵 | 不同於 rsort() 重置索引,arsort 保持「值→次數」關聯。 |
array_slice($arr, 0, $n, true) | 取前 N 保持鍵 | 第 4 參數 true 關鍵:保持原鍵 (元素值),否則重置為 0,1,2... 導致無法知曉是哪個值。 |
// 1. 多維陣列扁平化後統計
$flat = array_merge_recursive(...$multiArray); // 或自訂遞歸扁平
$result = mostRepeatedValues($flat, 10);
// 2. 物件陣列統計某屬性
$users = [['name'=>'A','role'=>'admin'], ['name'=>'B','role'=>'user'], ...];
$roles = array_column($users, 'role'); // ['admin','user',...]
$result = mostRepeatedValues($roles, 3);
// 3. 忽略大小寫統計字串
$ci_counts = array_count_values(array_map('strtolower', $stringArray));
arsort($ci_counts);
array_count_values 遍歷一次 O(N),建立雜湊表 O(U) (U=唯一值數)。arsort 排序 O(U log U)。GROUP BY col ORDER BY COUNT(*) DESC LIMIT N 推算。php-hyperloglog 擴展)。// 錯誤 1: array_slice 未保持鍵 $top = array_slice($counts, 0, 5); // 返回 [0=>5, 1=>3, 2=>3...] 丟失元素值! // 錯誤 2: rsort 重置索引 rsort($counts); // 同樣丟失鍵關聯 // 錯誤 3: 型別混雜導致統計錯誤 $data = [1, "1", 1.0]; // array_count_values 視為相同鍵 '1' → 次數 3 // 實際 PHP 會轉字串鍵,1, "1", 1.0 都成 '1'
array_count_values → arsort → array_slice(..., true) 這三步組合是 PHP 陣列頻率統計的標準模式。掌握鍵值保持機制與型別轉換規則,能快速實作各類 Top-N 統計需求。