-2

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 ]

shampally
  • 1
  • 3

2 Answers2

0

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;
    }

?>
Ng Sek Long
  • 2,493
  • 16
  • 28
0

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

*/
Emunot
  • 1
  • 1