在抽獎、隨機推薦、測試資料取樣等場景,常需要從陣列中隨機抽取指定數量且不重複的元素。本文封裝一個 unique_array() 函數,支援去重、打亂、限制數量,並處理邊界情況。
<?php
/**
* 從陣列隨機取得指定數量的不重複元素
*
* @param array $array 來源陣列
* @param int $total 欲取得的元素數量
* @param bool $unique 是否先去重(預設 true)
* @return array 隨機元素陣列
*/
function unique_array(array $array, int $total, bool $unique = true): array {
// 1. 選擇性去重
if ($unique) {
$array = array_values(array_unique($array)); // 重新索引
}
// 2. 打亂順序
shuffle($array);
// 3. 取前 $total 個(若不足則全取)
$length = count($array);
$count = min($total, $length);
return array_slice($array, 0, $count);
}
?>
<?php
$phrases = [
'Hello Sailor','Acid Test','Bear Garden','Botch A Job','Dark Horse',
'In The Red','Man Up','Pan Out','Quid Pro Quo','Rub It In','Turncoat',
'Yes Man','All Wet','Bag Lady','Bean Feast','Big Wig', 'Big Wig',
'Bear Garden','All Wet','Quid Pro Quo','Rub It In'
];
// 取 1 個(去重)
print_r(unique_array($phrases, 1));
// 取 5 個(去重)
print_r(unique_array($phrases, 5));
// 取 5 個(不去重,可能重複)
print_r(unique_array($phrases, 5, false));
// 取 100 個(去重,實際最多不重複項數)
print_r(unique_array($phrases, 100));
// 取 100 個(不去重)
print_r(unique_array($phrases, 100, false));
?>
array_values() 重新索引,否則 array_slice() 可能取不到預期元素。array_rand() 取亂數鍵名,避免 shuffle() 全量複製記憶體。$unique = false 可省去去重開銷。unique_array() 以簡潔程式碼解決隨機不重複取樣需求,參數彈性適用多種場景。希望本文對您的 PHP 程式設計有所幫助。