如何在PHP和MySQL中生成循环赛?

Siv*_*iva 4 php mysql

我需要使用循环算法生成游戏序列.我有一个php页面,用户可以在其中输入将插入到数据库中的锦标赛名称,并且它有一个最多32个团队的下拉菜单(选择团队数量).

因此,如果我在页面中选择4个团队,那么它将从团队1到团队4,这将是6场比赛,因为每个团队都会对其他团队进行一次.我知道算法是如何工作的,但我不太清楚如何为此编写查询.

我创建了表团队:

Team_id    01     02     03     etc
Team_name  Team1  Team2  Team3  etc.
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

小智 16

我从头开始创建了一个roundrobin函数,因为我认为可能更容易得到相同的结果,并且还允许我使用直接填充字符串的数组而不是数字.

因为我从数据库中提取名称列表并添加到数组中,我现在可以使用以下函数直接计划.将数字与姓名等联系起来无需额外步骤

请随意尝试,如果有效,请发表评论.我还有一个允许2路(归位和返回)时间表和/或随机播放选项的版本.如果somone对那个感兴趣,那么也要留下一个co.

<?php

/**
 * @author D.D.M. van Zelst
 * @copyright 2012
 */

function scheduler($teams){
    if (count($teams)%2 != 0){
        array_push($teams,"bye");
    }
    $away = array_splice($teams,(count($teams)/2));
    $home = $teams;
    for ($i=0; $i < count($home)+count($away)-1; $i++){
        for ($j=0; $j<count($home); $j++){
            $round[$i][$j]["Home"]=$home[$j];
            $round[$i][$j]["Away"]=$away[$j];
        }
        if(count($home)+count($away)-1 > 2){
            array_unshift($away,array_shift(array_splice($home,1,1)));
            array_push($home,array_pop($away));
        }
    }
    return $round;
}
?>
Run Code Online (Sandbox Code Playgroud)

如何使用,例如创建一个数组:

<?php $members = array(1,2,3,4); ?>
Run Code Online (Sandbox Code Playgroud)

要么

<?php $members = array("name1","name2","name3","name4"); ?>
Run Code Online (Sandbox Code Playgroud)

然后调用函数根据上面的数组创建你的日程安排:

<?php $schedule = scheduler($members); ?>
Run Code Online (Sandbox Code Playgroud)

要显示结果数组时间表,只需按照下面的说法进行,或者无论如何你喜欢:这个小代码以一种很好的格式显示时间表,但无论如何都要使用它.

<?php
foreach($schedule AS $round => $games){
    echo "Round: ".($round+1)."<BR>";
    foreach($games AS $play){
        echo $play["Home"]." - ".$play["Away"]."<BR>";
    }
    echo "<BR>";
}
?>
Run Code Online (Sandbox Code Playgroud)

如果它适用于您,或者如果您对带有shuffle的双向版本感兴趣,请留言.


Cha*_*rch 8

有一个相当简单的算法来进行循环比赛,我的解决方案如下(伪代码):

  • 以任何顺序将数据库中的所有团队提取到一个数组中
  • for(i = 1; i <团队数量; i ++)
    • Round #i打印对决:
    • 数组上半部分的队伍与阵列后半部分的队伍按照相同的顺序进行匹配.也就是说,任何索引[n]的团队都与索引[n +团队数量的一半]的团队相匹配.如果你有32支队伍,[0]与[16],[1]和[17]等匹配,直到[15]和[31].
    • 现在,通过数组"旋转"团队,但将第一个留在阵列中.也就是说,[1]变为[2],[2]变为[3],......,最多[31]变为[1],但不会将团队移动到索引[0].

就是这样,这将产生你需要的所有对决.

一个例子,有4个团队:

阵列的前半部分位于顶部,后半部分位于底部,匹配是高于/低于对方的数字.数组索引(以说明我的意思):

[0] [1]
[2] [3]
Run Code Online (Sandbox Code Playgroud)

第1轮:

1 2
3 4
Run Code Online (Sandbox Code Playgroud)

第2轮:

1 4
2 3
Run Code Online (Sandbox Code Playgroud)

第3轮:

1 3
4 2
Run Code Online (Sandbox Code Playgroud)

  • 我宁愿不.你在"答案"中输入代码的尝试表明,你真的根本不明白你在做什么,只是把你的解决方案交给你做作业对你的情况没有帮助.算法的所有步骤都很简单,请阅读一些基本的PHP教程. (7认同)
  • 好的算法,但它有一个问题 - 一个团队总是在家里玩.如果一支球队不会超过2次或在家中参赛,那将会很不错.可能吗? (2认同)