統計陣列中出現頻率最高的元素是常見的資料分析需求。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 參數保持鍵名不變<?php
function getMostFrequent($array) {
$result = mostRepeatedValues($array, 1);
return $result ? key($result) : null;
}
echo getMostFrequent($array); // 輸出: 3
?>
<?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
)
*/
?>
<?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 為不重複元素數量<?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(),僅需幾行程式碼即可高效解決「陣列高頻元素統計」問題。本文提供的封裝函數支援指定返回數量、多維陣列欄位統計、並列處理等進階功能,可直接應用於實際專案中。