【问题标题】:php - Selecting random from array without repeatingphp - 从数组中随机选择而不重复
【发布时间】:2018-05-15 18:41:09
【问题描述】:

我正在处理页面,它为您提供(基于范围输入)来自数组的随机字符串。它通过带有 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)];
}

谢谢:)

//编辑1

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

【问题讨论】:

  • $rage* 变量放入数组0-3 being the keys 然后只需执行$vystup = $rage[$rageFactor][array_rand($rage[$rageFactor])];.. simplez
  • 澄清 - 所以你有 4 个数字范围,用户应该能够从其中一个数组中选择一个随机值。用户根据表单输入选择要使用的数组。另外,每个数组不能多次返回相同的值?
  • 我有 4 个用字符串填充的数组。用户按范围选择 $rageFactor(数组的数量,从中选择随机字符串),并从选定的数组中为他提供随机字符串。但有时(大部分)它给了他 3 次相同的字符串,然后是另一个字符串,然后是 2 次另一个字符串,等等......我想至少消除它有时给他相同的字符串。现在我正在尝试劳伦斯的建议。
  • @LawrenceCherone edit1 就像我的代码现在看起来一样,但它不断给我返回“r”...

标签: php arrays random


【解决方案1】:

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

【讨论】:

  • 我有 4 个字符串数组。每个数组中的字符串数都是不同的。
【解决方案2】:

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$rage1or ...。

它将显示一个随机元素,来自一个随机的 $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])];

【讨论】:

  • 它简化了代码,但有时仍会给出与之前相同的字符串
  • 而$rageFactor是通过POST从form中获取的。
  • $rageFactor的内容是什么?
  • 哦,抱歉没有定义。它是范围的值。
  • 这是一个像 0, 1, 2 .. 的数字?只需将$rageFactor = rand(0,3); 替换为$rageFactor = $_POST['rageFactor'];
【解决方案3】:

您可以将愤怒范围存储在会话中,选择要使用的范围,抓取一个随机元素,然后从会话中删除该元素,使其不再使用。当会话中的范围为空时,这将自行重置。

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

【讨论】:

    猜你喜欢
    • 2016-02-01
    • 2019-01-28
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多