求助:基于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输出:

- 当前调度输出:

需求与问题
我的核心需求是实现每个队伍每晚的比赛场次等于count($data['gameTimes']),之前尝试在代码多处添加$data['gameTimes']的foreach循环,但都未得到预期效果,求可行的解决方法。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

