php - 从数组中随机选择而不重复

时间:2018-05-15 18:41:09

标签: php arrays random

我在页面上工作,它给你(基于范围输入)来自数组的随机字符串。它的工作方式是使用post方法,进入同一个网站,该表格在哪里。但我遇到了问题。它大部分都给出了之前给出的相同字符串,所以我想以某种方式从数组中保存键,并将其与新随机选择的键进行比较。问题是,我是初学者,我不知道该怎么做。如果你能帮助我,我会很高兴。

当前的一段代码:($ 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)];
}

谢谢:)

// EDIT1

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

3 个答案:

答案 0 :(得分:0)

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作为数组的解决方案:

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

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

答案 1 :(得分:0)

通过上面的一条评论,你有一个包含4个字符串的数组,这是一个很简单的方法,只需在数组上使用shuffle()http://php.net/manual/en/function.shuffle.php

答案 2 :(得分:0)

您可以在会话中存储范围,选择要使用的范围,抓取随机元素,然后从会话中删除该元素,以便不再使用它。当会话中的范围变空时,这将自动重置。

<?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 );