Tu es effectivement sur la bonne voie avec tes boucles imbriquées. Il te faut en effet parcourir une première liste contenant les supporters (qui te génèreront les lignes), et pour chaque supporter parcourir une liste contenant les différents bus (qui te génèrerons les colonnes). Enfin, pour chacun de ces bus, il te faut vérifier si le supporter le prend ou non.
Tes deux listes, tu les as déjà en base, et tes deux boucles ne devraient pas poser de problème. Ce qui doit te manquer c'est comment savoir si une case est cochée ou non, et le plus simple pour cela, est effectivement de constituer un tableau à deux dimensions contenant cette information.
On va en fait essayer de constituer le tableau suivant (ou un truc approchant, quand tu auras compris t'en fera ce que tu veux

), qui doit correspondre à tous les bus que le supporter prend :
$tableau = array (
Paul => array ( // Paul prend paris et toulouse
PSG,
FCT
),
Yvan => array ( // Yvan marseille
OM
)
Jeanne => array(
FCT,
OM
)
);
(J'ai collé des noms pour que ce soit plus parlant, mais ça marche tout pareil avec des ids)
L'intérêt de ce tableau, c'est que tu vas pouvoir l'intérroger facilement pour vérifier si un couple supporter/bus existe.
Par exemple, je veux savoir si Paul prend le bus pour marseille, j'ai juste a tester la présence de la clé $tableau['Paul']['OM'] (je regarde si mon tableau comporte un index Paul, et si celui-ci est un tableau comportant l'index OM). Si celle-ci existe, c'est qu'il y va a marseille, sinon c'est qu'il n'y va pas.
Ainsi, tu vas pouvoir très facilement mettre au point tes boucles :
foreach ( ... as $hooligan) {
foreach ( ... as $bus) {
if (isSet($tableau[$hooligan][$bus]))
echo $hooligan . ' prend le bus ' . $bus; // tu peux aussi simplement cocher une case ;p
}
}
L'objectif maintenant étant de constituer le tableau à partir des données que tu dois avoir en base. Mais j'imagine que tu dois avoir une table de bus, une table de supporters et une table te permettant de lier les deux (avec un id issu de chacune des tables). A partir de cette table, un simple while devrait te permettre de le constituer
Quant à tes cases à cocher, le plus simple est probablement de nommer de la même manière toutes les cases d'une ligne avec des crochets (ex: paul[], yvan[], ...) et de changer leur valeur en fonction du bus. Lors de la validation du formulaire, tu n'aurais alors qu'à parcourir le tableau $_POST['paul'] pour connaitre les ids de tous les bus qui doivent lui être associés...