有谁知道如何将数组分成两组,没有任何组(在这种情况下团队)再次相遇,直到可能性不足为止?
数组[0,1,2,3,4,5]
答案 0 :(得分:0)
这绝对不是最好的方法,请自行优化(这只适用于偶数团队):
<?php
$allTeams = [0,1,2,3,4,5];
$everyGames = [];//Append team matches to this
foreach($allTeams as $team1){
foreach($allTeams as $team2){
if (!in_array([$team2, $team1], $everyGames)
&& $team2 !== $team1) {
$everyGames[] = [$team1, $team2];
}
}
}
$copyOfEveryGames = $everyGames;
$needToLoopAgain = true;
while($needToLoopAgain ){
$allRounds = [];
$needToLoopAgain = false;
$everyGames = $copyOfEveryGames;
shuffle($everyGames);//Shuffle it for the random array
while(count($everyGames) > 0){
$allMatches = [];
$tempEveryGames = $everyGames;
for($i = 0; $i < count($allTeams) / 2; $i++){
foreach($tempEveryGames as $key => $game){
if(!(in_array_r($game[0], $allMatches) || in_array_r($game[1], $allMatches))){
$allMatches[] = $game;
unset($tempEveryGames[$key]);
break;
}
}
}
if(count($allMatches) === count($allTeams) / 2){
$everyGames = $tempEveryGames ;
$allRounds[] = $allMatches;
}else{
$needToLoopAgain = true;
break;
}
}
if(count($allRounds) !== count($allTeams) -1){
$needToLoopAgain = true;
}
}
//Display Example
foreach($allRounds as $round){
print_r($round);
echo "<br>";
}
/*
Example Output:
Array ( [0] => Array ( [0] => 0 [1] => 3 )
[1] => Array ( [0] => 1 [1] => 4 )
[2] => Array ( [0] => 2 [1] => 5 ) )
Array ( [0] => Array ( [0] => 0 [1] => 2 )
[1] => Array ( [0] => 4 [1] => 5 )
[2] => Array ( [0] => 1 [1] => 3 ) )
Array ( [0] => Array ( [0] => 1 [1] => 2 )
[1] => Array ( [0] => 3 [1] => 4 )
[2] => Array ( [0] => 0 [1] => 5 ) )
Array ( [0] => Array ( [0] => 1 [1] => 5 )
[1] => Array ( [0] => 0 [1] => 4 )
[2] => Array ( [0] => 2 [1] => 3 ) )
Array ( [0] => Array ( [0] => 0 [1] => 1 )
[1] => Array ( [0] => 2 [1] => 4 )
[2] => Array ( [0] => 3 [1] => 5 ) )
*/
//Copied from http://stackoverflow.com/questions/4128323/in-array-and-multidimensional-array
function in_array_r($needle, $haystack, $strict = false) {
foreach ($haystack as $item) {
if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
return true;
}
}
return false;
}
?>
答案 1 :(得分:0)
如果我理解你的问题,我希望这能回答你的问题。
function againstWho(array $teams) : array{
$fixture = null;
foreach($teams as $key => $team){
unset($teams[$key]);
$fixture[$team] = $teams;
$teams[] = $team;
}
return $fixture;
}
// EXAMPLE
$teams = ['MANU', 'ARS', 'LIV', 'CHE', 'MANC'];
foreach (againstWho($teams) as $team => $fixtures){
echo "$team will face ";
foreach ($fixtures as $key => $rival){
echo "$rival, ";
}
echo "<br />";
}
// Her's what gets printed
/*
MANU will face ARS, LIV, CHE, MANC,
ARS will face LIV, CHE, MANC, MANU,
LIV will face CHE, MANC, MANU, ARS,
CHE will face MANC, MANU, ARS, LIV,
MANC will face MANU, ARS, LIV, CHE
*/