Prova
...
//Detect change in category
if($catID != $categoryId)
{
echo "<h3>Category 01: <span>{$category}</span><span></span></h3>";
echo "<div class='container'>";
echo "<table>";
if (is_array($subjects))
{
foreach ($subjects as $sub) {
echo "<tr>";
echo "<td>";
echo $sub;
echo "</td>";
echo "</tr>";
}
}
else
{
echo "<tr><td>No subjects to display...<td/><tr/>";
}
echo "</table>";
echo "</div> <!-- End .container DIV -->";
}
...
Aggiorna
Ho pensato di cambiare l'approccio che hai usato per recuperare i dati dal DB. Prova questo codice (il codice non è testato, l'ho digitato usando il blocco note) quindi potresti dover aggiustarlo un po'...)
$categoryIds = implode(',', $_SESSION['category']);
$q = "SELECT c. category_id AS ci, c.category_name AS cn
FROM category AS c
WHERE c.category_id IN ($categoryIds)";
$r = mysqli_query( $dbc, $q) ;
$catID = false;
$max_columns = 2;
while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC))
{
$categoryId = $row['ci'];
$category = $row['cn'];
echo '<div>';
echo "<h3>Category 01: <span>{$category}</span><span></span></h3>\n";
$qs = "SELECT s.subject_name AS sn, s.subject_id AS si
FROM category_subjects cs
INNER JOIN subjects AS s ON s.subject_id = cs.subject_id
WHERE cs.category_id = \'' . $categoryId . '\'";
$rs = mysqli_query( $dbc, $qs) ;
echo "<h3>Category 01: <span>{$category}</span><span></span></h3>";
echo "<div class='container'>";
echo "<table>";
while ($rows = mysqli_fetch_array($rs, MYSQLI_ASSOC))
{
$sub = $rows['sn'];
echo "<tr>";
echo "<td>";
echo $sub;
echo "</td>";
echo "</tr>";
}
echo "</table>";
echo "</div> <!-- End .container DIV -->";
echo '</div>';
}
In questo recuperiamo prima le Categorie, andiamo in un ciclo prima stampa il nome della categoria e all'interno del ciclo recuperiamo i soggetti appropriati per la categoria corrente, quindi stampiamo il successivo e così via...