php - 循环调度器填写 "byes"

标签 php mysql loops round-robin sports-league-scheduling-problem

我正在使用循环赛来安排比赛。我希望每支球队都打“n”场比赛,而我有“x”支球队。如果“x”是偶数,则一切都很好,但如果“x”是奇数,我必须添加另一个团队,“再见”才能使其正常工作。

当我有 11 支球队每场比赛 4 场时,轮空的结果是 4 支球队轮空。这是低效的,因为他们可以互相比赛,这样每支球队都会打 4 场比赛。

在安排了所有比赛(包括一支球队“再见”的比赛)之后,我试图让所有已经度过“再见周”的球队并让他们互相比赛一场比赛。我需要确保这些球队之前没有比赛过。

由于我使用的团队数量较少,因此我只是使用随机发生器来尝试组合,直到其中一个有效为止。但是,我无法让它发挥作用。

这是我的代码,用于安排每轮比赛的球队。我想仔细检查一下他们以前是否玩过,如果玩过,则随机排列列表,以便我们可以尝试不同的组合。我不认为检查球队到目前为止是否参加过比赛是有效的,因为即使球队有重叠,它也不会重新洗牌。

while (true){
                        $needshuffled = "no";
                    for ($j=0; $j < $maxgames/2; $j++){
                        $k = $j*2;
                        $round[$maxgames][$j]["Home"]=$byeteams[$k];
                        $round[$maxgames][$j]["Away"]=$byeteams[$k+1];

                        $home = $round[$maxgames][$j]["Home"];
                        $away = $round[$maxgames][$j]["Away"];

                        $sql = "SELECT * FROM `temp` 
                            WHERE (Home = '$home' and Away = '$away') 
                               or (Home = '$away' and Away = '$home')";
                        if ($conn->query($sql) === TRUE) {
                            if ($result=mysqli_query($conn,$sql))
                            {
                                    // Return the number of rows in result set
                                    $rowcount=mysqli_num_rows($result);
                                    if ($rowcount > 0)
                                    {
                                        $needshuffled = "yes";
                                    }
                            }   

                        }
                    }

                    if ($needshuffled == "no"){
                        break;
                    }
                }

最佳答案

如果将其用于 select 语句,则

if ($conn->query($sql) === TRUE) 不为 true,请参阅 documentation :

Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.

由于无论如何您都会执行两次,因此您可以完全删除此行并仅使用

$sql = "SELECT * FROM `temp` 
        WHERE (Home = '$home' and Away = '$away') 
        or (Home = '$away' and Away = '$home')";
if ($result=mysqli_query($conn,$sql)) {
    ...

或者,由于您的变量 $round 中已包含完整的日程安排,因此您可以使用它来检查现有匹配。

您可以尝试不同的策略:

对于队伍数量为奇数且天数为偶数的循环赛, future 的某一天,已经轮空的球队的子集将与已经轮空的球队进行比赛,所有尚未轮空的队伍将在当天轮空或与尚未轮空的队伍进行比赛。

您需要做的就是不断生成循环赛表,直到找到这一天并使用当天的比赛。

关于php - 循环调度器填写 "byes",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39293517/

相关文章:

javascript - 在需要正向计数时,是否有更好、更快、更易读的方法来提高循环效率?

loops - Rust:在 “while let”中访问可变参数

php - 7bit 和 8bit 编码的消息在输出之前必须解码吗?

php - mysqli_query()至少需要2个参数,给定1个

javascript - WordPress 的 wp_enqueue_script 问题

mysql - 从一张表和一张对应的表中获取记录

php - 将变量/值传递给自定义异常?

MySQL 全文搜索运行速度极慢

php - NULL 作为 codeignitier 事件记录选择中的列?

PHP while循环,表格行