尝试使用shuffle设置值

时间:2015-02-27 05:25:36

标签: php arrays logic shuffle

好的,这就是我的问题。我有一系列的名字。我想以随机顺序设置一个名称指向另一个名称的位置。但没有任何名字指向自己。我希望每个值都由不同的值指向,每个值只指向一个值,而不是自身。 希望我能想出一个更好的方式来表达这一点。这是我目前正在使用的方法

    while($xcount>=1){
        $orderarray[($xcount-1)]=$xcount;
        $xcount--;
    }
    shuffle($orderarray);

问题是我不希望$ orderarry [$ x]等于[$ x],这似乎几乎每次都会发生。有没有办法做到这一点。

无论如何,当一群人把自己的名字戴在帽子上,然后每个人从帽子里挑出一个名字时,我试图虚拟地去做会发生什么。喜欢秘密的圣诞老人。

2 个答案:

答案 0 :(得分:0)

试试这个

$names = [1, 2, 3, 4, 5];
shuffle($names);
while (key($names) !== null)
    {
    $current = current($names);
    $next = next($names);
    if ($next) // is not last
        $bonds[] = [$current, $next];
    }
$bonds[] = [end($names), reset($names)]; // last
var_dump($bonds);

答案 1 :(得分:0)

使用以下代码解决问题,获取一个随机数并确保该号码未被使用且未指向自身。

    $neworder=array();
    $xcount=count($gmemberarray);
    //fill the array with numbers and a setting of false *hasn't been used*
    while($xcount>=1){
        //$orderarray[($xcount-1)]=arrray();
        $orderarray[($xcount-1)][0]=($xcount-1);
        $orderarray[($xcount-1)][1]=false;
        $xcount--;
    }
    $xcount=count($gmemberarray);
    $count=$xcount;
    while($xcount>=1){
        R:
        $randnum=rand(0, ($count-1));
        if($orderarray[$randnum][1]==true) //If it's already been used get a different number
            goto R; //otherwise try again
        if($xcount!=$randnum){ //if it's not equal to itself
            $neworder[($xcount-1)]=$randnum;
            $orderarray[$randnum][1]=true;
            echo "<br><br>Neworder ".$xcount.": ".$neworder[($xcount-1)];
        }
        else
            goto R; //otherwise try again
        $xcount--;

    }

输入数据将是:

    orderarray[1]=1
    orderarray[2]=2
    orderarray[3]=3
    orderarray[4]=4

我希望输出的一个例子是:

    orderarray[1]=3
    orderarray[2]=4
    orderarray[3]=2
    orderarray[4]=1