PHP单一消除锦标赛表

时间:2012-06-07 21:18:45

标签: php html-table

我查看了其他类似的帖子,但找不到任何适合我所寻找的内容......

我已经设法对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 个答案:

答案 0 :(得分:5)

修改

好吧我决定在凌晨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的幂)来表示每个“游戏”在第一轮中,我们可以不断拆分并在数学上解决打印团队的行#。因此,公式规定,对于在$team轮中编号为$round的团队,将在行$row中列出。团队数量总是除以2,因为有一半团队被淘汰。您在代码中完成的总轮次数仅为总团队的2个对数。接下来的分数会在两队之间发布,因此确定不会太糟糕。

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

我希望这有助于您实现我尝试设置的目标。如果我有时间,我会尝试做些什么。欢呼声。

答案 1 :(得分:1)

最快最简单的方法是将手动编码的html保存到某种模板文件中。比方说,tournament-table.html

接下来,将保存的模板文件中动态数据的每个实例更改为模板标记,例如:

  • 第1组=&gt; {#组1名}
  • 第2组=&gt; {#组2名}
  • 得分1 =&gt; {#score1名}
  • 冠军=&gt; {#冠军名}

您的模板看起来像这样:

<tr><td>{#group1-name}</td><td width='20'></td></tr>
<tr><td align='center'>{#score1-name}</td><td></td><td>{#round1-winner}</td><td width='20'></td></tr>

接下来,要填写数据,您只需将模板加载到变量中并对其进行字符串替换:

  • 要加载数据,请执行以下操作:

    $raw_template = file_get_contents('/path/to/your/template/tournament-table.html');
    
  • 将所需数据填入变量:

    //do the needed queries
    //after that, fill variable with query and processes result
    $group1_name = "Group 1";
    $group2_name = "Group 2";
    $Score1_name = "Score 1";
    
  • 下一步是执行字符串替换:

    $raw_template = str_replace('{#group1-name}', $group1_name, $raw_template, 1);
    
  • 最后,回应结果:

    echo $raw_template;