拆分数组,随机随机播放

时间:2017-01-21 11:23:38

标签: php html

有谁知道如何将数组分成两组,没有任何组(在这种情况下团队)再次相遇,直到可能性不足为止?

数组[0,1,2,3,4,5]

2 个答案:

答案 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

*/
相关问题