Турнирная таблица 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'>&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 2

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\">&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 команд

16 команд

Ура


Оригинал: У меня нет на это времени. напишите сценарий, но с математической точки зрения он должен работать по какой-то схеме. Если вы предполагаете, что команды всегда имеют силу 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;