首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 陣列統計高頻元素:array_count_values + arsort 一行搞定

     編輯:PHP 相關知識

需求:找出陣列中出現次數最多的前 N 個元素

常見於:標籤雲排行、熱門搜尋關鍵字、日誌 IP 統計、推薦系統特徵提取等場景。

核心解法:三大內建函數串聯

<?php
function mostRepeatedValues(array $array, int $limit = 0): array
{
    if (empty($array)) return [];

    // 1. 統計每個值出現次數 → ['value' => count]
    $counts = array_count_values($array);

    // 2. 依次數由大到小排序,保持鍵值關聯
    arsort($counts);

    // 3. 可選:只取前 $limit 個
    if ($limit > 0) {
        $counts = array_slice($counts, 0, $limit, 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];

// 取前 5 高頻
print_r(mostRepeatedValues($data, 5));

輸出結果

Array
(
    [3] => 5
    [4] => 3
    [1] => 3
    [9] => 2
    [45] => 2
)
說明:數字 3 出現 5 次居首,4 與 1 並列 3 次,9、45 各 2 次。

進階變體:多維陣列 / 物件屬性統計

// 陣列中每個元素為關聯陣列,統計某欄位值頻率
$users = [
    ['name' => 'Alice', 'city' => 'Taipei'],
    ['name' => 'Bob', 'city' => 'Taichung'],
    ['name' => 'Cathy', 'city' => 'Taipei'],
    ['name' => 'David', 'city' => 'Kaohsiung'],
];

$cities = array_column($users, 'city'); // ['Taipei','Taichung','Taipei','Kaohsiung']
print_r(mostRepeatedValues($cities, 3));
// Array ( [Taipei] => 2 [Taichung] => 1 [Kaohsiung] => 1 )

效能與記憶體考量

資料量時間複雜度空間複雜度建議
< 10 萬O(n log n) — 排序主導O(k) — k 為唯一值數量直接使用內建函數,極快
10 萬 ~ 100 萬O(n log n)O(k)注意記憶體峰值,必要時分批處理
> 100 萬O(n log k) — 堆排序/Top-KO(k)改用 SplMaxHeap 或 Redis Sorted Set 統計

替代方案:手寫單次遍歷(極大資料量)

function topKFrequency(array $array, int $k): array
{
    $counts = [];
    foreach ($array as $v) {
        $counts[$v] = ($counts[$v] ?? 0) + 1;
    }

    // 維護大小為 k 的最小堆
    $heap = new SplMinHeap();
    foreach ($counts as $value => $freq) {
        $heap->insert(['freq' => $freq, 'value' => $value]);
        if ($heap->count() > $k) $heap->extract();
    }

    $result = [];
    while (!$heap->isEmpty()) {
        $top = $heap->extract();
        $result[$top['value']] = $top['freq'];
    }
    return array_reverse($result, true); // 由大到小
}
此法時間複雜度 O(n log k),空間 O(k),適合百萬級以上資料且只需 Top-K。

結語

對於絕大多數中小型專案,array_count_values() + arsort() + array_slice() 三連招最簡潔、可讀性最高、效能足夠。僅當資料量達百萬級且記憶體敏感時,才需引入堆排序或外部存儲(Redis/Mysql)聚合統計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved