Итак, вот моя проблема. У меня есть массив имен. Я хочу установить, где одно имя указывает на другое, в случайном порядке. Но без какого-либо имени, указывающего на себя. Я хочу, чтобы каждое значение указывалось другим значением, а каждое значение указывало только на одно значение, а не на себя. Хотел бы я придумать лучший способ выразить это. Вот метод, который я использую на данный момент
while($xcount>=1){
$orderarray[($xcount-1)]=$xcount;
$xcount--;
}
shuffle($orderarray);
Проблема в том, что я не хочу, чтобы $ orderarry [$ x] равнялся [$ x], что, кажется, происходит почти каждый раз. Есть ли способ сделать это.
Во всяком случае, я пытаюсь виртуально сделать то, что происходит, когда группа людей все помещает свои имена в шляпу, и каждый человек затем выбирает имя из шляпы. Как для тайного Санты.
Попробуй это
$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);
Решил проблему с помощью следующего кода, получив случайное число и убедившись, что число не использовалось и не указывает на себя.
$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