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

PHP 從陣列隨機取得不重複元素的實用函數

     編輯:PHP 相關知識

前言

在抽獎、隨機推薦、測試資料取樣等場景,常需要從陣列中隨機抽取指定數量且不重複的元素。本文封裝一個 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_unique() 移除重複值,但保留原鍵名,需配合 array_values() 重新索引,否則 array_slice() 可能取不到預期元素。
  • shuffle() 就地打亂陣列,返回布林值,不返回新陣列。
  • array_slice() 安全截取,超出長度不會報錯。
  • 參數型別宣告:PHP 7.0+ 建議加上型別提示,提升可讀性與 IDE 支援。

效能考量

  • 大陣列(>10萬元素)建議改用 array_rand() 取亂數鍵名,避免 shuffle() 全量複製記憶體。
  • 若來源資料本身無重複,設定 $unique = false 可省去去重開銷。

總結

unique_array() 以簡潔程式碼解決隨機不重複取樣需求,參數彈性適用多種場景。希望本文對您的 PHP 程式設計有所幫助。

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