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

PHP 獲取陣列中出現次數最多元素的高效實現

     編輯:PHP 相關知識

前言

統計陣列中出現頻率最高的元素是常見的資料分析需求。PHP 內建的 array_count_values() 配合排序函數,能以極簡潔的程式碼高效解決此問題。本文提供完整實現與進階擴展。

核心實現

<?php
/**
 * 獲取陣列中重複最多的元素
 * @param array $array 輸入陣列
 * @param int $length 返回前 N 個高頻元素,0 表示返回全部
 * @return array|false 關聯陣列 [元素 => 出現次數],失敗返回 false
 */
function mostRepeatedValues($array, $length = 0) {
    // 參數驗證
    if (empty($array) || !is_array($array)) {
        return false;
    }
    
    // 1. 統計各元素出現次數
    $counts = array_count_values($array);
    
    // 2. 按出現次數降序排序(保持鍵值關聯)
    arsort($counts);
    
    // 3. 可選:限制返回數量
    if ($length > 0) {
        $counts = array_slice($counts, 0, $length, true);
    }
    
    return $counts;
}

// 測試資料
$array = array(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 個高頻元素
$counts = mostRepeatedValues($array, 5);
print_r($counts);

/* 輸出結果:
Array
(
    [3] => 5
    [4] => 3
    [1] => 3
    [9] => 2
    [45] => 2
)
*/
?>

函數詳細解析

關鍵函數說明

  • array_count_values():統計陣列中所有值的出現次數,返回關聯陣列 [值 => 次數]
  • arsort():關聯陣列降序排序,保持鍵值關係
  • array_slice():截取陣列片段,true 參數保持鍵名不變

進階擴展功能

1. 返回單一最高頻元素

<?php
function getMostFrequent($array) {
    $result = mostRepeatedValues($array, 1);
    return $result ? key($result) : null;
}

echo getMostFrequent($array); // 輸出: 3
?>

2. 處理多維陣列指定欄位統計

<?php
function mostRepeatedField($array, $field, $length = 0) {
    // 提取指定欄位值
    $values = array_column($array, $field);
    return mostRepeatedValues($values, $length);
}

// 使用範例
$users = array(
    array('id' => 1, 'city' => '台北'),
    array('id' => 2, 'city' => '台中'),
    array('id' => 3, 'city' => '台北'),
    array('id' => 4, 'city' => '高雄'),
    array('id' => 5, 'city' => '台北'),
);

print_r(mostRepeatedField($users, 'city', 2));
/* 輸出:
Array
(
    [台北] => 3
    [台中] => 1
)
*/
?>

3. 並列處理:返回所有最高頻元素

<?php
function getAllMostFrequent($array) {
    $counts = mostRepeatedValues($array);
    if (!$counts) return array();
    
    $maxCount = max($counts);
    return array_keys(array_filter($counts, function($v) use ($maxCount) {
        return $v === $maxCount;
    }));
}

// 如果有多個元素出現次數相同且最高,全部返回
$test = array('a', 'a', 'b', 'b', 'c');
print_r(getAllMostFrequent($test)); // Array ( [0] => a [1] => b )
?>

效能分析與優化

時間複雜度

  • array_count_values:O(n) - 單次遍歷
  • arsort:O(m log m) - m 為不重複元素數量
  • 總體:O(n + m log m),對於大多數場景極其高效

大資料量優化建議

<?php
// 針對超大陣列(百萬級以上)的記憶體優化版
function mostRepeatedValuesLarge($array, $length = 0) {
    if (empty($array) || !is_array($array)) return false;
    
    $counts = array();
    foreach ($array as $value) {
        // 直接累加計數,避免 array_count_values 產生中間陣列
        if (isset($counts[$value])) {
            $counts[$value]++;
        } else {
            $counts[$value] = 1;
        }
    }
    
    arsort($counts);
    
    if ($length > 0) {
        $counts = array_slice($counts, 0, $length, true);
    }
    
    return $counts;
}
?>

實際應用場景

  • 熱門標籤統計:文章標籤、商品屬性出現頻率分析
  • 用戶行為分析:最常訪問頁面、最高頻操作路徑
  • 資料清洗:找出髒資料中的異常高頻值
  • 推薦系統:基於熱門度的簡單推薦策略

總結

利用 PHP 內建函數 array_count_values() 配合 arsort(),僅需幾行程式碼即可高效解決「陣列高頻元素統計」問題。本文提供的封裝函數支援指定返回數量、多維陣列欄位統計、並列處理等進階功能,可直接應用於實際專案中。

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