2016-02-17 69 views
0

我想建立一个足球比赛,我必须在球队之间生成所有回合。 然后,我有这样的怎样才能生成一轮排列

$array = array(1,2,3,4,5,6,7,8); 

怎样才能不用重复元素之间的所有置换的数组。

array(1,2) 
array(3,4) 
array(5,6) 
array(7,8) 

下一迭代

array(1,3) 
array(2,4) 
array(5,7) 
array(6,8) 

随着正常排列接收重复这样

(1 2) (3 4) (5 6) (7 8) 
(2 1) (3 4) (5 6) (7 8) 

3和4已经在上一轮。同样的5到6和7到8.

+0

你需要根据您的条件创建数组排列的算法? –

+2

8支队伍(队伍#0....'队伍#7'),7天('#1'..'day#7')。如果'A xor B = D',则#队'#'在#日'#队'上进行比赛# –

+0

@EgorSkriptunoff这真是太棒了。做一个答案。 –

回答

1

为了完整起见(上SO),这里是从another answer张贴(感谢M69的评论以上)的代码:

/****************************************************************************** 
* Round Robin Pairing Generator 
* Author: Eugene Wee 
* Date: 23 May 2005 
* Last updated: 13 May 2007 
* Based on an algorithm by Tibor Simko. 
* 
* Copyright (c) 2005, 2007 Eugene Wee 
* 
* Permission is hereby granted, free of charge, to any person obtaining a copy 
* of this software and associated documentation files (the "Software"), to deal 
* in the Software without restriction, including without limitation the rights 
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
* copies of the Software, and to permit persons to whom the Software is 
* furnished to do so, subject to the following conditions: 
* 
* The above copyright notice and this permission notice shall be included in 
* all copies or substantial portions of the Software. 
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
* THE SOFTWARE. 
******************************************************************************/ 

function generateRoundRobinPairings($num_players) { 
    // Do we have a positive number of players? If not, default to 4. 
    $num_players = ($num_players > 0) ? (int)$num_players : 4; 

    // If necessary, round up number of players to nearest even number. 
    $num_players += $num_players % 2; 

    // Format for pretty alignment of pairings across rounds. 
    $format = "%0" . ceil(log10($num_players)) . "d"; 
    $pairing = "$format-$format "; 

    // Set the return value 
    $ret = $num_players . " Player Round Robin:\n-----------------------"; 

    // Generate the pairings for each round. 
    for ($round = 1; $round < $num_players; $round++) { 
     $ret .= sprintf("\nRound #$format : ", $round); 
     $players_done = array(); 

     // Pair each player except the last. 
     for ($player = 1; $player < $num_players; $player++) { 
      if (!in_array($player, $players_done)) { 
       // Select opponent. 
       $opponent = $round - $player; 
       $opponent += ($opponent < 0) ? $num_players : 1; 

       // Ensure opponent is not the current player. 
       if ($opponent != $player) { 
        // Choose colours. 
        if (($player + $opponent) % 2 == 0 xor $player < $opponent) { 
         // Player plays white. 
         $ret .= sprintf($pairing, $player, $opponent); 
        } else { 
         // Player plays black. 
         $ret .= sprintf($pairing, $opponent, $player); 
        } 

        // This pair of players are done for this round. 
        $players_done[] = $player; 
        $players_done[] = $opponent; 
       } 
      } 
     } 

     // Pair the last player. 
     if ($round % 2 == 0) { 
      $opponent = ($round + $num_players)/2; 
      // Last player plays white. 
      $ret .= sprintf($pairing, $num_players, $opponent); 
     } else { 
      $opponent = ($round + 1)/2; 
      // Last player plays black. 
      $ret .= sprintf($pairing, $opponent, $num_players); 
     } 
    } 

    return $ret; 
} 
-1

我使用array_filter来清除重复和团队会自己玩的情况。

<?php 
$teams = range(1,8); 

$match_permutations = array(); 

foreach($teams as $team1) { 
    foreach($teams as $team2) { 
     $match_permutations[] = array($team1, $team2); 
    } 
} 

//var_dump($match_permutations); 

$match_combinations = array_filter($match_permutations, 
    function($item) { 
     if($item[0] < $item[1]) return true; 
    } 
); 

var_dump($match_combinations); 
+0

参见:http://stackoverflow.com/a/35453060/ 3392762为什么这个工程。 – Progrock

+0

敢问一问,为什么要投票? – Progrock

+0

这不是我...... –

-1

如果我们有四支球队,我们可以写出所有可能的匹配排列是这样的:

(1, 1) (1, 2) (1, 3) (1, 4) 
(2, 1) (2, 2) (2, 3) (2, 4) 
(3, 1) (3, 2) (3, 3) (3, 4) 
(4, 1) (4, 2) (4, 3) (4, 4) 

你可以看到在对角线镜像重复。

我用下面的代码输出上面:

for($i=1; $i<5; $i++) { 
    for($j=1; $j<5; $j++) { 
     echo "($i, $j) "; 
    } 
    echo "\n"; 
} 

如果我们只关心楹联其中$ i小于附加$ J。或者,在$ i大于$ j的情况下,我们删除重复项和对角线本身(球队自己的位置)。

function team_combinations($no_teams) { 
    $combinations = array(); 
    for($i=1; $i<=$no_teams; $i++) { 
     for($j=1; $j<=$no_teams; $j++) { 
      if($i < $j) 
       $combinations[] = array($i, $j); 
     } 
    } 

    return $combinations; 
} 

var_export(team_combinations(4)); 

输出:

array (
    0 => 
    array (
    0 => 1, 
    1 => 2, 
), 
    1 => 
    array (
    0 => 1, 
    1 => 3, 
), 
    2 => 
    array (
    0 => 1, 
    1 => 4, 
), 
    3 => 
    array (
    0 => 2, 
    1 => 3, 
), 
    4 => 
    array (
    0 => 2, 
    1 => 4, 
), 
    5 => 
    array (
    0 => 3, 
    1 => 4, 
), 
)