簡體   English   中英

PHP-從數組中選擇隨機而不重復

[英]php - Selecting random from array without repeating

我正在頁面上工作,它為您(基於范圍輸入)提供了來自數組的隨機字符串。 它通過郵寄方式通過表單工作,該表單位於同一網站。 但是我遇到了問題。 通常,它提供與以前相同的字符串,因此我想以某種方式保存數組中的鍵,並將其與新隨機選擇的鍵進行比較。 問題是,我是初學者,但我不知道該怎么做。 如果您能幫助我,我會很高興。

當前代碼:($ vystup代表輸出,$ rageFactor是范圍輸入,$ rage0-$ rage4是包含字符串的數組)

$rageFactor = $_POST["rageFactor"];
if ($rageFactor == "0"){
$vystup = $rage0[array_rand($rage0)];
} else if ($rageFactor == "1"){
$vystup = $rage1[array_rand($rage1)];
} else if ($rageFactor == "2"){
$vystup = $rage2[array_rand($rage2)];
} else if ($rageFactor == "3"){
$vystup = $rage3[array_rand($rage3)];
}

謝謝 :)

//編輯1

$rage = array("rage0", "rage1", "rage2", "rage3");
$vystup = $rage[$rageFactor][array_rand($rage[$rageFactor])];

PHP具有某些功能,有時不可讀,但要避免代碼重復。

session_start();

$rageFactor = $_POST['rageFactor']; //rage number, for test use $rageFactor = rand(0,3);

$rage = getRage($rageFactor);

if(isset($_SESSION['rage'])) {
    while($rage == $_SESSION['rage']) {
        $rage = getRage($rageFactor);
    }
}

$_SESSION['rage'] = $rage;
echo $rage;

function getRage($rageFactor)
{
    $varName = 'rage'.$rageFactor;

    $rage0 = ['A','B','C'];
    $rage1 = ['D','E','F'];
    $rage2 = ['G','H',];
    $rage3 = ['I','J'];

    $vystup = $$varName[array_rand($$varName)];
    return $vystup;
}

該代碼使用“動態變量” $$varName ,它將在運行時轉換為$rage0$rage1或...。

它將顯示來自隨機$rageX數組的隨機元素,具體取決於您擁有的$rageFactor輸入。

當然,您可以創建一個名為$rage的多維數組,而不是倍數變量。 這將是一個更好的方法。

編輯:使用憤怒作為數組的解決方案:

$rage = [
    ['A','B','C'],
    ['D','E','F'],
    ['G','H',],
    ['I','J']
];

$rageIndex = rand(0, count($rage));
echo $rage[$rageIndex][array_rand($rage[$rageIndex])];

根據上面的評論之一,您有一個包含4個字符串的數組,這是一種不錯的簡便方法,只需在數組上使用shuffle() http://php.net/manual/zh/function.shuffle.php

您可以在會話中存儲范圍,選擇要使用的范圍,獲取隨機元素,然后從會話中刪除該元素,以便不再使用它。 當會話范圍變為空時,這將重置自身。

<?php

session_start();

$source = [
    'rage1' => range(1, 10),
    'rage2' => range(11, 20),
    'rage3' => range(21, 30),
    'rage4' => range(31, 40),
];

foreach ($source as $name => $rage) {
    if (!isset($_SESSION[$name])|| empty($_SESSION[$name])) {
        $_SESSION[$name] = $rage;
    }
}

$whichOne = 'rage' . $_POST['rageFactor'];

$output = null;

if (isset($_SESSION[$whichOne]) && !empty($_SESSION[$whichOne])) {
    shuffle($_SESSION[$whichOne]);

    // array_pop is the key here. It removes the last element by reference.
    $output = array_pop($_SESSION[$whichOne]);
}

var_dump( $output );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM