Does anyone know how I can split an array into groups of two, without any group(team in this case) meeting eachother again till running out of possibilities?
array [ 0, 1, 2, 3, 4, 5 ]
Does anyone know how I can split an array into groups of two, without any group(team in this case) meeting eachother again till running out of possibilities?
array [ 0, 1, 2, 3, 4, 5 ]
This is definitely not the optimal way to do this, please optimize it yourself (this will work for only even number of teams):
<?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;
}
?>
I hope this answers your question, If I understand your question well.
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
*/