需求:從大量數值中找出去重後的最大 10 個與最小 10 個。本文示範 array_unique() + sort()/rsort() + array_slice() 組合解法。
核心程式碼
// 1. 產生 10,000 個 1-100,000 隨機數
$data = [];
for ($i = 0; $i < 10000; $i++) $data[] = rand(1, 100000);
// 2. 去重 → 升序排序
$data = array_unique($data);
sort($data); // 升序,最小在前
// 3. 取最小 10
$min10 = array_slice($data, 0, 10);
// 4. 取最大 10(從尾部取 10 個再倒序)
$max10 = array_slice($data, -10, 10);
rsort($max10); // 降序,最大在前
// 5. 輸出
echo "最小 10:\n"; print_r($min10);
echo "最大 10:\n"; print_r($max10);
輸出範例
最小 10:
Array ( [0] => 16 [1] => 19 [2] => 22 [3] => 31 [4] => 40 [5] => 49 [6] => 71 [7] => 74 [8] => 80 [9] => 92 )
最大 10:
Array ( [0] => 99997 [1] => 99991 [2] => 99973 [3] => 99958 [4] => 99955 [5] => 99946 [6] => 99939 [7] => 99933 [8] => 99927 [9] => 99900 )
關鍵函式對照
| 函式 | 作用 |
| array_unique() | 移除重複值,保留首次出現的鍵 |
| sort() | 升序排序,重設數字鍵 0..n-1 |
| rsort() | 降序排序,重設數字鍵 |
| array_slice($arr, -10, 10) | 從陣列末尾向前取 10 個元素 |
進階:單次遍歷找 Top-K(不排序全量)
資料量極大(億級)無法排序時,使用最小堆/最大堆維護大小為 K 的結構,時間複雜度 O(n log k),空間 O(k)。PHP 可用 SplMinHeap/SplMaxHeap 實作:
function topKMin($data, $k) {
$heap = new SplMaxHeap(); // 最大堆保存最小的 k 個
foreach ($data as $v) {
if ($heap->count() < $k) $heap->insert($v);
elseif ($v < $heap->top()) { $heap->extract(); $heap->insert($v); }
}
$result = []; foreach ($heap as $v) $result[] = $v; return array_reverse($result);
}
適用場景選擇