通過隨機索引取值,隨即 unset 該索引並將後續元素前移,保證不重複抽取。
<?php
class GetValues {
private $inputArray = [];
private $number = 0;
public function inputValue($inputArray) {
$this->inputArray = $inputArray;
}
public function getValue($number) {
$this->number = $number;
$getArray = [];
for ($i = 0; $i < $this->number; $i++) {
$maxIndex = count($this->inputArray) - 1 - $i;
$index = rand(0, $maxIndex);
$getArray[$i] = $this->inputArray[$index];
unset($this->inputArray[$index]);
// 手動前移後續元素填補空洞
for ($k = $index; $k < count($this->inputArray); $k++) {
$this->inputArray[$k] = $this->inputArray[$k + 1];
}
}
// asort($getArray); // 可選排序
return $getArray;
}
}
// 測試
$keywords = ["我們", "你們", "他們"];
$gv = new GetValues();
$gv->inputValue($keywords);
$key = $gv->getValue(1); // 隨機抽取 1 個
var_dump($key);
?>
原生 array_rand($array, $num) 直接返回隨機鍵名陣列,更簡潔高效:
$keys = array_rand($keywords, 1); // 返回單個鍵或鍵陣列
$result = is_array($keys) ? array_intersect_key($keywords, array_flip($keys)) : [$keywords[$keys]];