Турнирная таблица PHP Single Elimination
Я просмотрел несколько других сообщений, похожих на это, но не могу найти ничего, что подходит к тому, что я ищу...
Мне удалось жестко запрограммировать таблицу 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'> </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>
Вот что он производит:
И вот моя попытка создать вышеописанные операторы 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."'> </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>";
?>
И вот как это выглядит:
В конечном счете имена команд, результаты и победители будут извлечены из БД, поэтому необходимо будет включить это как только я смогу правильно построить структуру.
Я также хотел бы, чтобы это было масштабируемо до 64 команд и автоматически рисовало таблицу, основанную на этом количестве команд, без использования вручную жестких таблиц кода, поскольку это займет годы, чтобы создать таблицы для 16,32 и 64 команд. В сочетании с рассмотрением двойного исключения для до 64 команд, которые сделают ручное кодирование этой массивной работы!
Любые указатели или помощь в этом будут высоко оценены!
2 ответа:
Редактировать:
Хорошо, я решил заняться этой проблемой немного раньше 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\"> </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\"> </td>\n"; } } } echo "\t</tr>\n"; } echo "</table>\n"; ?>
Ура
Оригинал: У меня нет на это времени. напишите сценарий, но с математической точки зрения он должен работать по какой-то схеме. Если вы предполагаете, что команды всегда имеют силу 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 базовых лога всего команд, как вы сделали в своем коде. Следующие оценки публикуются между каждой парой команд, так что это не так уж плохо, чтобы определить.Самая большая проблема, конечно, заключается в том, что вам нужно распечатать таблицу, которая требует перехода по строке, а не по столбцу при печати. Лучший способ-иметь целевую формулу, и вы проверяете, удовлетворяет ли строка и столбец, в которых вы находитесь, уравнению, которое просто требует простой функции для проверки (когда вы идете через генерацию общего числа столбцы, которые вы знаете, так как вы знаете, сколько раундов).
Я надеюсь, что это поможет привести вас к цели, которую я пытаюсь установить. Я постараюсь сделать что-нибудь позже, если у меня будет время. Овации.
Самый быстрый и простой способ-сохранить вручную закодированный html-код в файл шаблона. Пусть говорят,
tournament-table.html
.Далее, измените каждый экземпляр того, что будет динамическими данными в сохраненном файле шаблона, на теги шаблона, например:
- Группа 1 => {#group1-name}
- Группа 2 => {#group2-name}
- оценка 1 => {#score1-name}
- чемпион => {#имя чемпиона}
Ваш шаблон будет выглядеть примерно так:
<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;