"Player", ...) * round_num = 0-based contiguous index * player_num = 0-based contiguous index (the number of players is cut in half each round) */ // You are responsible for building up your bracket for each round using your own logic to determine who advances to the next round // The winner of match [0][0] and [0][1] will be stored in [1][0], the winner of match [0][2] and [0][3] will be stored in [1][1], and so on $bracket = array(); $rounds = 6; for ($i = 0; $i < $rounds; $i++) for ($j = 0; $j < pow(2, ($rounds-$i-1)); $j++) $bracket[$i][$j] = array("name" => "Player " . ($j*pow(2, $i))); // Now let's see what happens if we have an unfilled bracket unset($bracket[0][15]); unset($bracket[0][31]); // This logic to ensure a filled bracket should occur after the initial logic to build your bracket // This will only ensure a filled bracket for the first round of competition (which is most common), but the logic could easily be expanded to fill the bracket at any round $num = count($bracket[0]); // Not a full bracket (not a power of 2), add byes if (($num & ($num-1)) != 0) { // This is the size the bracket should be $num = pow(2, ceil(log10($num)/log10(2))); for ($i = 0; $i < $num; $i++) if (!isset($bracket[0][$i])) $bracket[0][$i] = array("name" => "Bye"); } // And now we actually draw the bracket // The trick here is to create a grid using a table // Only the cells containing a player will be "turned on" (border set) // Cells located vertically between players in a given round will have their right border set to create the bracket effect print "\n"; $height = count($bracket[0])*2-1; $width = count($bracket); for ($i = 0; $i < $height; $i++) { print ""; for ($j = 0; $j < $width; $j++) { // These variables are used to determine which cells to draw data in $start = pow(2, $j)-1; $offset = pow(2, ($j+1)); // This variable is used to map the grid position back to the 0-based contiguous array index for a given round // I feel like this equation could be simplified further, but I just couldn't find it $num = (($i+1) / pow(2, ($j+1))) - 0.5; $hasdata = ($i == $start || ($i - $start) % $offset == 0); $hasborder = ($j < ($width-1) && floor($num) % 2 == 0); $classes = array(); if ($hasdata) $classes[] = "withborder"; if ($hasborder) $classes[] = "borderright"; $classes = implode(" ", $classes); print "" . ($hasdata ? $bracket[$j][$num]["name"] . (isset($bracket[$j][$num]["result"]) ? " - " . $bracket[$j][$num]["result"] : "") : "") . ""; } print "\n"; } print "
\n"; ?>