query($sql)->fetchAll(); // Group by category. Hidden activities are easter eggs: they are rendered into // a section that stays hidden until the page script reveals it. $byVisibility = ['visible' => [], 'secret' => []]; foreach ($rows as $row) { $gid = $row['groupID']; $vis = $row['hidden'] ? 'secret' : 'visible'; if (!isset($byVisibility[$vis][$gid])) { $byVisibility[$vis][$gid] = ['name' => $row['groupName'], 'activities' => []]; } $byVisibility[$vis][$gid]['activities'][] = [ 'id' => $row['activityID'], 'name' => $row['activityName'], ]; } $groups = $byVisibility['visible']; $secretGroups = $byVisibility['secret']; function render_activity_group(array $group): void { ?>