You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于Round Robin的多场夜间赛事调度器场次匹配问题

循环赛调度生成器开发问题

我正在开发一款支持同一夜间进行多场比赛、赛事间隔指定时长(当前为7天)的循环赛(Round Robin)赛事调度生成器,现有PHP代码如下:

$data = [
    'season' => $this->request->getPost('season'),
    'teams' => $this->request->getPost('teams[]'),
    'days' => $this->request->getPost('days[]'),
    'start' => $this->request->getPost('start'),
    'gameTimes' => $this->request->getPost('gameTimes[]'),
];

dd($data);
$teamslist = $data['teams'];
$startDate = $data['start'];

// 如果队伍数量为奇数,添加轮空队伍
if (count($teamslist) % 2 != 0)
{ 
    array_push($teamslist,"IGNORE"); 
} 

shuffle($teamslist);

$away = array_splice($teamslist,(count($teamslist)/2)); 
$home = $teamslist; 


// 遍历生成每一轮的所有比赛
for ($i = 0; $i < ((count($teamslist)+count($away))-1); $i++)
{
    // 打乱列表实现随机性
    for ($j = 0; $j < count($home); $j++)
    {
        // 分配对阵队伍、日期、时间等信息
        if (($i%2 != 0) && ($j%2 == 0))
        { 
            if ($j%2 == 0)
            {
                $startDate=date('Y-m-d',strtotime($startDate));
            }

            $match[$i][$j]["Home"]=$away[$j]; 
            $match[$i][$j]["Away"]=$home[$j]; 
            $match[$i][$j]["Date"]=$startDate;
            $match[$i][$j]["Time"]="10:00:00";
        } 

        else 
        { 
            if ($j%2==0)
            {
                $startDate=date('Y-m-d',strtotime($startDate));
            }

            $match[$i][$j]["Home"]=$away[$j]; 
            $match[$i][$j]["Away"]=$home[$j]; 
            $match[$i][$j]["Date"]=$startDate;
            $match[$i][$j]["Time"]="10:00:00";
        } 
    } 

    // 调整队伍顺序生成下一轮对阵
    if(count($home)+count($away)-1 > 2)
    { 
        $splice=array_splice($home,1,1);
        $shift=array_shift($splice);
        array_unshift($away,$shift); 
        array_push($home,array_pop($away)); 
    } 
    $startDate=date('Y-m-d',strtotime($startDate."+7 days"));
    
}   

// 过滤掉包含轮空队伍的比赛
foreach($match as $matchkey => $matchval)
{
    foreach($matchval as $gamekey=>$game)
    {
        if($game["Home"]!= "IGNORE" && $game["Away"]!="IGNORE")
        {
            // 存储有效比赛到新数组
            $allmatches[$matchkey][$gamekey]=$game;
        }
    }   

}

现有数据与输出截图

  • $data输出:
    $data输出截图
  • 当前调度输出:
    当前调度输出截图

需求与问题

我的核心需求是实现每个队伍每晚的比赛场次等于count($data['gameTimes']),之前尝试在代码多处添加$data['gameTimes']的foreach循环,但都未得到预期效果,求可行的解决方法。

内容的提问来源于stack exchange,提问作者Brandon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:25:29