gpt4 book ai didi

PHP 单败淘汰赛 table

转载 作者:行者123 更新时间:2023-12-03 20:30:59 26 4
gpt4 key购买 nike

我已经浏览了其他几个与此类似的帖子,但找不到适合我正在寻找的东西......

我已经成功地硬编码了一个 8 支球队的锦标赛分组表,但我真的想要一种根据输入的球队数量使用 for/if 语句来绘制该表的方法。

这是使用 colspans 和 rowspans 对表格进行硬编码以创建空格的代码(在你说使用 CSS 而不是表格之前,我不太了解 CSS,但对表格很有信心):

<table border='1' cellspacing='1' cellpadding='1'>
<tr><td colspan='2' width='120'><b>Round 1</b></td></td><td colspan='2' width='120'><b>Round 2</b></td></td><td colspan='2' width='120'><b>Final</b></td><td width='120'><b>Winner</b></td></tr>
<tr><td colspan='2'>&nbsp;</td><td colspan='2' rowspan='2'></td><td colspan='2' rowspan='4'></td><td rowspan='8'></td></tr>
<tr><td>Group 1</td><td width='20'></td></tr>
<tr><td align='center'>Score 1</td><td></td><td>Round 1 Winner</td><td width='20'></td></tr>
<tr><td>Group 2</td><td></td><td rowspan='3' align='center'>Score 5</td><td></td></tr>
<tr><td colspan='2'></td><td></td><td>Round 2 Winner</td><td width='20'></td></tr>
<tr><td>Group 3</td><td></td><td></td><td rowspan='7' align='center'>Score 7</td><td></td></tr>
<tr><td align='center'>Score 2</td><td></td><td>Round 1 Winner<td></td><td></td></tr>
<tr><td>Group 4</td><td></td><td colspan='2' rowspan='3'></td><td></td></tr>
<tr><td colspan='2'></td><td></td><td>Champion</td></tr>
<tr><td>Group 5</td><td></td><td></td><td rowspan='8'></td></tr>
<tr><td align='center'>Score 3</td><td></td><td>Round 1 Winner</td><td></td><td></td></tr>
<tr><td>Group 6</td><td></td><td rowspan='3' align='center'>Score 6</td><td></td><td></td></tr>
<tr><td colspan='2'></td><td></td><td>Round 2 Winner</td><td></td></tr>
<tr><td>Group 7</td><td></td><td></td><td colspan='2' rowspan='3'></td></tr>
<tr><td align='center'>Score 4</td><td></td><td>Round 1 Winner</td><td></td></tr>
<tr><td>Group 8</td><td></td><td colspan='2'></td></tr>
</table>

这是它产生的结果:

Image1

到目前为止,这是我使用 for 和 if 语句创建上述内容的尝试,我已经到了它在第一列中列出团队名称的地步,但我无法从中找出我需要做的事情点...

<?php
echo "<table border='1' cellspacing='1' cellpadding='1'>";
$num_teams = 8;
$nRounds = floor(log($num_teams,2));
$max_rows = $num_teams*2;
for ($row = 0; $row <= $max_rows; $row++)
{
echo "<tr>";
if ($row == 0)
{
for ($i = 1; $i <= $nRounds+1; $i++)
{
if($i < $nRounds)
{
echo "<td width='120'><b>Round ".$i."</b></td>";
echo "<td width='20'></td>";
}
elseif($i == $nRounds)
{
echo "<td width='120'><b>Final</b></td>";
echo "<td width='20'></td>";
}
else
{
echo "<td width='120'><b>Winner</b></td>";
}
}
}
elseif($row == 1)
{
$rowwhitespace = ($nRounds*2)+1;
echo "<td colspan='".$rowwhitespace."'>&nbsp;</td>";
}
else
{
$rowwhitespace = ($nRounds*2);
for ($i = 1; $i <= $num_teams; $i++)
{
if($i == $row/2)
{
echo "<td>Group ".$i."</td>";
echo "<td colspan='".$rowwhitespace."'></td>";
}
}
}
echo "</tr>";
}
echo "</table>";
?>

这是它的样子:

Image2

最终,团队名称、分数和获胜者将从数据库中提取,因此一旦我能够正确布置结构,就需要将其合并。

我还希望它可以扩展到 64 个团队,并根据那么多团队自动绘制表格,而无需使用手动硬编码表格,因为这需要很长时间才能为 16、32 和 64 个团队创建表格。再加上考虑对多达 64 个团队进行双重淘汰,这将使手动编码成为一项艰巨的工作!

如有任何建议或帮助,我们将不胜感激!

最佳答案

编辑:

好吧,我决定在凌晨 2 点之前解决这个问题。花了大约半个小时来调试。我知道我没有更多的跨度,但我不想再花时间尝试这样做,因为它需要更多地调整数学公式才能正确获得这些公式。屏幕截图如下。如果您需要任何解释,请告诉我。

<?php

function is_player($round, $row, $team) {
return $row == pow(2, $round-1) + 1 + pow(2, $round)*($team - 1);
}

$num_teams = 16;
$total_rounds = floor(log($num_teams, 2)) + 1;
$max_rows = $num_teams*2;
$team_array = array();
$unpaired_array = array();
$score_array = array();

for ($round = 1; $round <= $total_rounds; $round++) {
$team_array[$round] = 1;
$unpaired_array[$round] = False;
$score_array[$round] = False;
}


echo "<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\">\n";
echo "\t<tr>\n";

for ($round = 1; $round <= $total_rounds; $round++) {

echo "\t\t<td colspan=\"2\"><strong>Round $round</strong></td>\n";

}

echo "\t</tr>\n";

for ($row = 1; $row <= $max_rows; $row++) {

echo "\t<tr>\n";

for ($round = 1; $round <= $total_rounds; $round++) {
$score_size = pow(2, $round)-1;
if (is_player($round, $row, $team_array[$round])) {
$unpaired_array[$round] = !$unpaired_array[$round];
echo "\t\t<td>Team</td>\n";
echo "\t\t<td width=\"20\">&nbsp;</td>\n";
$team_array[$round]++;
$score_array[$round] = False;
} else {
if ($unpaired_array[$round] && $round != $total_rounds) {
if (!$score_array[$round]) {
echo "\t\t<td rowspan=\"$score_size\">Score</td>\n";
echo "\t\t<td rowspan=\"$score_size\" width=\"20\">$round</td>\n";
$score_array[$round] = !$score_array[$round];
}
} else {
echo "\t\t<td colspan=\"2\">&nbsp;</td>\n";
}
}

}

echo "\t</tr>\n";

}

echo "</table>\n";

?>

8 Teams

16 Teams

干杯


原文:我没有时间编写脚本,但从数学上讲,它应该遵循某种模式。如果你假设球队总是 2 的幂(所以你总能有冠军)并且在开始第一轮时有 4 行,那么你有

1| Empty Row
2| Team 1
3| Score
4| Team 2

然后我们可以在数学上做如下:

$round 为轮次编号,$row 为行号,$team 为轮次中的团队编号(将解释一下)。

团队打印在 $row = [2^($round-1) + 1] + [2^($round)]*$team 上,您需要了解此公式把它画出来,但基本上因为团队是 2 的幂并且你使用 4 行(2 的幂)来表示第一轮中的每个“游戏”,我们可以不断地将事情分解并在数学上解决团队所在的行 #打印。所以公式表明,对于 $round 轮中编号为 $team 的团队,将列在行 $row 中,团队的数量总是除以2 因为一半的队伍被淘汰了。正如您在代码中所做的那样,总轮数只是团队总数的基数 2 日志。接下来的分数会在每对球队之间发布,因此确定起来还算不错。

当然,最大的问题是您需要打印一个表格,打印时需要按行而不是按列。最好的方法是有一个目标公式,然后测试你所在的行和列是否满足只需要一个简单函数来测试的方程式(当你生成你知道的列总数时,你知道有多少回合)。

我希望这有助于引导您实现我正在尝试设置的目标。如果我有时间,我会尝试做点什么。干杯。

关于PHP 单败淘汰赛 table ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10940047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com