我有一个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
的原因。
答案 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)
像这样。使用goto
。goto
运算符可用于跳转到程序中的另一部分。
<?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;
}
}