Codice PHP:
echo "<table><tr><td id='centro'>";

  echo 
"<table style='width: 100%;'><caption>IL CAMPIONATO</caption>";
  if (isset(
$campionato)) {
    
$andata=0;
    
$ritorno=1;
    
ksort($campionato); # necessario, almeno x ins_campionato.php
    # divide il campionato nei due gironi andata e ritorno mantenendo come chiave la giornata
    
$giorn_gir=array_chunk($campionato,count($campionato)/2,true);
    foreach (
$giorn_gir[$andata] as $giorn_and_n => $giorn_and) {
      list(,
$giorn_rit)=each($giorn_gir[$ritorno]);
      echo 
"<tr><td class='quadro'>";

  echo 
"<table class='giornata'>";
  foreach (
$giorn_and as $gara_and_n => $gara_and) {
    list(,
$gara_rit)=each($giorn_rit);
    if (
$gara_and_n=='data') {
      echo 
"<caption>[i](A: ".$gara_and.")[/i] ";
      echo 
$giorn_and_n."ª Giornata [i](R: ";
      echo 
$gara_rit.")[/i]</caption>";
    } else {
      
$i_sqinc=$gara_and['i_sqinc'];
      
$i_sqint=$gara_and['i_sqint'];
      echo 
"<tr><td class='ris_and'>".risultato_visualizzabile($gara_and['risultato'],FALSE)."</td>";
      echo 
"<td class='sq_prima_in_casa'".color_mia_sq($squadre[$i_sqinc],$mia_squadra).">";
      echo 
squadra_visualizzabile($squadre[$i_sqinc])."</td>";
      echo 
"<td class='trattino'>-</td>";
      echo 
"<td class='sq_prima_in_trasf'".color_mia_sq($squadre[$i_sqint],$mia_squadra).">";
      echo 
squadra_visualizzabile($squadre[$i_sqint])."</td>";
      echo 
"<td class='ris_rit'>".risultato_visualizzabile($gara_rit['risultato'],TRUE)."</td></tr>";
    }
  }
echo 
"</table>";

      echo 
"</td></tr>";
    }
  } else
    echo 
"<tr><td>Il calendario del campionato non è ancora disponibile!</td></tr>";
  echo 
"</table>";

echo 
"</td></tr></table>"
$giorn_and è un array con indici da 1 a 8 per le gare e 'data' che indica la data della giornata (ovviamente $giorn_rit si riferisce alle gare del girone di ritorno);
la funzione risultato_visualizzabile capovolge il risultato per il ritorno, mentre squadra_visualizzabile sceglie e visualizza le parti dell'array da visualizzare;

per quanto riguarda invece la formattazione css ho questo file allegato (ho messo solo la parte interessata)

codice:
body { font-family: tahoma, verdana, arial; text-align: center; }

caption {
          padding-top: 18px;
          color: #003366;
          font-size: 16px;
          font-weight: bold;
          text-decoration: underline;
        }

td { vertical-align: top; }

i {
    font-style: normal;
    font-size: 11px;
    font-weight: normal;
  }

#centro {
          width: 526px;
          height: 751px;
          background-image: url(index_file/rilievo_serie_a.jpg);
          background-repeat: repeat;
          color: #003366;
          font-size: 11px;
        }

.quadro { border: thin solid #003366; width: 100%; }
.quadro table caption { padding-top: 0px; text-decoration: none; }

.giornata { width: 100%; }

td.ris_and { width: 16px; text-align: left; color: white; }
td.sq_prima_in_casa { width: 44%; text-align: right; font-size: 9px; }
td.trattino { width: 0px; }
td.sq_prima_in_trasf { width: 44%; text-align: left; font-size: 9px; }
td.ris_rit { width: 16px; text-align: right; color: white; }
nel sito che ho costruito ho fatto uso massiccio di table, tr, td;
pochissimo le liste, e niente <div> e

; il fatto è che le tabelle mi danno l'impressione di essere sempre la soluzione più adatta, e non so mai in quali casi invece è più indicata un'altra soluzione!