2

これに似た他のいくつかの投稿を調べましたが、探しているものに合ったものが見つかりません...

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>

これはそれが生成するものです:

画像1

これまでのところ、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>";
?>

そして、これが次のようになります。

画像2

最終的に、チーム名、スコア、および勝者は DB から取得されるため、構造を正しくレイアウトできるようになったら、それを組み込む必要があります。

また、16 チーム、32 チーム、64 チームのテーブルを作成するには時間がかかるため、手動でハードコードされたテーブルを使用せずに、64 チームまで拡張可能で、その数のチームに基づいてテーブルを自動的に描画できるようにしたいと考えています。最大 64 チームのダブル エリミネーションを考慮すると、手動でコーディングするのは大変な仕事になります!

これに関するポインタや支援は大歓迎です!

4

2 に答える 2

5

編集:

よし、午前2時少し前にこの問題に取り組むことにした。デバッグに約 30 分かかりました。私はこれ以上スパニングがないことを知っていますが、それらを正しく取得するために数式を微調整する必要があるため、それを行うためにこれ以上時間を費やしたくありません。スクリーンショットが続きます。何か説明が必要な場合はお知らせください。

<?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 のログです。次のスコアは、これまでのチームのペアの間に投稿されるため、決定するのはそれほど悪くありません.

もちろん、最大の問題は、印刷するときに列ではなく行ごとに移動する必要があるテーブルを印刷する必要があるという事実です。最良の方法は、ターゲット式を用意し、現在の行と列が式を満たすかどうかをテストすることです。これには、単純な関数をテストするだけで済みます (列の数がわかっているため、列の総数を生成する場合)。ラウンド)。

これが、私が設定しようとしている目標にあなたを導くのに役立つことを願っています. 時間があれば後で何か作ってみようと思います。乾杯。

于 2012-06-08T17:21:04.483 に答える
1

最速かつ最も簡単な方法は、手動でコーディングした html をある種のテンプレート ファイルに保存することです。としましょうtournament-table.html

次に、保存されたテンプレート ファイル内の動的データのすべてのインスタンスをテンプレート タグに変更します。たとえば、次のようになります。

  • グループ 1 => {#group1-name}
  • グループ 2 => {#group2-name}
  • スコア 1 => {#score1-name}
  • チャンピオン => {#champion-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;
    
于 2012-06-08T07:56:43.590 に答える