循环中的PHP array_rand,其值始终与先前值不同

时间:2017-01-26 11:42:11

标签: php

我有一个PHP脚本如下:

<?php
$a = [1 => 1, 2 => 2, 3 => 3];

for ($x=1; $x<10; $x++) {
    $r = array_rand($a);
    echo $a[$r] . '<br>';
}
?>

每次输出都是随机的,但作为一个例子,它可能是这样的:

2 1 3 3 2 3 1 3 2

我想要实现的是确保每次输出值时都与之前的值不同。因此,在上面的示例中,我不希望发生3 3。

我试图提出我自己的解决方案,其中涉及存储&#34;当前&#34;名为$current_value的变量中的输出值,并确保它不会接下来输出的内容:

<?php
$a = [1 => 1, 2 => 2, 3 => 3];

$current_value = false;
for ($x=1; $x<10; $x++) {

    if ($current_value) {
        $r = array_rand($a);
        while ($current_value !== $r) {
            echo $a[$r] . '<br>';
            $current_value = $a[$r];
        }
    } else {
        $r = array_rand($a);
        echo $a[$r] . '<br>';
        $current_value = $a[$r];
    }
}
?>

虽然我没有按顺序出现相同的值(至少从我测试过的内容),但循环只输出一个随机数字的数字,通常小于$x<10。我的猜测是,没有什么可以处理$current_value == $r所以它只是输出什么?

有人可以建议如何实现这个目标吗?预期输出为9(或for循环计数器设置为的任何整数)整数,序列中没有重叠,例如

2 1 3 1 2 3 1 3 2

编辑:输出的值必须始终为1,2或3.这就是我按照定义使用$a的原因。

6 个答案:

答案 0 :(得分:2)

我相信这个编码会做你想要的:

<?php
$a = [1, 2, 3];

$current_value = false;
for ($x=1; $x<10; $x++) {
    $r = array_rand($a, 1);
    if ($current_value !== $r) {
        echo $a[$r] . '<br>';
        $current_value = $r;
    }else{
        $x--;
    }
}

答案 1 :(得分:2)

只需制作一个递归函数。

如果等于最后一个数字,则对另一个数字进行排序的函数:

function myRand(array $array , $lastValue = null)
{
    $sorted = $array[array_rand($array)];   
    return $sorted == $lastValue ? myRand($array , $sorted) : $sorted;
}

执行新随机数组的长度/发生的函数:

function myArrayRand(array $array , $length)
{
    $sortedArray = [];
    while(count($sortedArray) < $length)
    {
        $sortedArray[] = myRand($array , end($sortedArray));
    }

    return $sortedArray;    
}

执行:

var_dump(myArrayRand([1 , 2 , 3] , 10));

结果:

array(10) {
   [0]=>
      int(1)
      [1]=>
      int(3)
      [2]=>
      int(2)
      [3]=>
      int(3)
      [4]=>
      int(1)
      [5]=>
      int(3)
      [6]=>
      int(1)
      [7]=>
      int(2)
      [8]=>
      int(1)
      [9]=>
      int(2)
}

array_rand从数组中返回随机密钥时,我将已排序的返回值作为来自$array的密钥。这就是你不需要使用索引数组的原因。

答案 2 :(得分:0)

像这样。使用gotogoto运算符可用于跳转到程序中的另一部分。

<?php
$a = [1 => 1, 2 => 2, 3 => 3];

$current_value = false;
for ($x=1; $x<10; $x++) {

    if ($current_value) {
        loop: $r = array_rand($a);
        if($current_value !== $r){
             echo $a[$r] . '<br>';
             $current_value = $a[$r];
        }
        else{
           goto loop; 
        }

    } else {
        $r = array_rand($a);
        echo $a[$r] . '<br>';
        $current_value = $a[$r];
    }
}
?>

有关详情,请参阅文档http://php.net/manual/en/control-structures.goto.php

答案 3 :(得分:0)

试试这个

$a = [1 => 1, 2 => 2, 3 => 3];
$pre_index=-1;
for ($x=1; $x<10; $x++) {

   $r = array_rand($a);
   if($pre_index==-1){

        echo $a[$r] . '<br>';
         $pre_index=$r;
   }else {

       while($pre_index==$r){

          $r = array_rand($a);

              }


    echo $a[$r] . '<br>';
    $pre_index=$r;
   }
}

答案 4 :(得分:0)

不确定我是否完全理解,但也许你之后会这样:

$a = [1 => 1, 2 => 2, 3 => 3];
$prev_value = false;
$results = [];
for ($x=1; $x<10; $x++) {
    $rand = array_rand($a);
    if($prev_value == $rand){
      do{
        $rand = array_rand($a);
      }while($prev_value === $rand);
}
$results[] = $rand;
$prev_value = $rand;
}

答案 5 :(得分:0)

您可以尝试使用end()函数。下面的代码可以帮助您

$a = array(1,2,3);
$out = array();
for ($x=1; $x<=10; $x++) {

$r = array_rand($a);
if(!end($out)== $r)
{
     $out[] = $r;
     echo $a[$r] . '<br>';
}
else
{
    $x=$x-1;
}

}