Php 如何进行循环赛安排,使两名球员在整个锦标赛中不再相互比赛

Php 如何进行循环赛安排,使两名球员在整个锦标赛中不再相互比赛,php,arrays,algorithm,schedule,Php,Arrays,Algorithm,Schedule,我有一个用户列表。例如- 1,2,3,…100 这些用户属于一个城市。其他城市也有类似的清单 我使用循环调度算法来安排属于同一城市的球员之间的比赛。因此,如果我想让每个玩家玩3场比赛,我会运行算法3次,而不是用户数-1。所以对于第一阶段,这是可以的 现在下一个阶段是国家间,即来自整个国家的球员之间。所以我想使用循环算法,但不希望以前玩过的玩家再次玩。我怎样才能做到这一点 这是我的循环计划: $users = range(0, 99); $played_before = array

我有一个用户列表。例如-

1,2,3,…100

这些用户属于一个城市。其他城市也有类似的清单

我使用循环调度算法来安排属于同一城市的球员之间的比赛。因此,如果我想让每个玩家玩3场比赛,我会运行算法3次,而不是用户数-1。所以对于第一阶段,这是可以的

现在下一个阶段是国家间,即来自整个国家的球员之间。所以我想使用循环算法,但不希望以前玩过的玩家再次玩。我怎样才能做到这一点

这是我的循环计划:

$users = range(0, 99);
        $played_before = array();
        foreach ($users as $key => $value) {
            $played_before[$value] = array_rand($users,3);
        }
shuffle($users);
$no_of_matches_per_player = 3;
if( $length % 2 == 1){
            $users = array_push($users, 'x');
        }

        $mid = $length / 2;

        $l1 = array();
        $l2 = array();

        for ($i=0; $i < $no_of_matches_per_player ; $i++) { 
            $l1 = array_slice($users, 0, $mid);
            $l2 = array_slice($users, $mid);
            $l2 = array_reverse($l2);

            $round = Embed::zip($l1, $l2);
            array_push($schedule, $round);
            $insert = array(array_pop($users));
            array_splice( $users, 1, 0, $insert);
        }
我以前创建过一个测试数组$users和$played\u

$played_before包含作为键的玩家ID和作为值的玩家数组

Embed::zip函数类似于python的zip函数。它从两个或多个数组中提取同一索引处的元素。例如。 数组1:1,2,3 数组2:4,5,6 Zip函数将返回: 数组:[0]=>数组1,4,[1]=>数组2,5,[2]=>数组3,6

州分为城市,城市分为俱乐部

比如说

Club1-1,2,3,…10

俱乐部2-11,12,13,…20

对于city stage,用户数组是1,2,3,…20,我在这个数组上执行循环调度

然后,对于状态阶段:

城市1:1,2,3,…20

城市2:21,22,23,…40


现在,用户数组将是1,2,3,….40,我必须循环使用一种方式,在前几个阶段玩过的玩家不会再玩了

你知道比赛日程中的随机性吗?是的,我洗牌用户数组。对不起,忘了加上那个。编辑了程序,所以您的问题是在相同的玩家中有重复的比赛?是的,洗牌后可以有重复的比赛。同样在状态阶段,列表将包括从城市1到城市k的所有用户,我不希望以前玩过的玩家再次玩。你能举一个简单的例子,说明你想如何安排城市之间的比赛,以便我能给你提供全面的答案吗