I am looking for better ways to write this code. At the moment it grabs a list of all navigation items and places them into an array (using PDO).
However, as you can see, it is using two foreach
loops to grab the subnavigation items under each parent. Is there a better way that this code can be written?
<ul id="nav">
<?php
if($grabNav = $db->prepare("SELECT caption,url,visibility,id,class,parent_id FROM navigation ORDER BY parent_id ASC, order_id ASC"))
{
$grabNav->execute();
$grabNav = $grabNav->fetchAll();
foreach($grabNav as $nav)
{
$visibility = true;
switch($nav['visibility'])
{
default:
case 0: $visibility = false; break;
case 1: $visibility = true; break;
case 2: if(LOGGED_IN && isset($cUser)) { $visibility = true; } else { $visibility = false; } break;
case 3: if(LOGGED_IN && isset($cUser)) { $visibility = false; } else { $visibility = true; } break;
}
if(!$visibility) { continue; }
if($nav['parent_id'] != -1) { continue; }
$class = $core->output($nav['class']);
if($nav['id'] == PAGE_ID) { $class .= ' selected'; }
echo '<li class="'.$class.'"><a href="'.$core->output($nav['url']).'">'.$core->output($nav['caption'],true).'</a><ul id="subNav">';
foreach($grabNav as $sub)
{
if($sub['parent_id'] == $nav['id'])
{
$visibility = true;
switch($sub['visibility'])
{
default:
case 0: $visibility = false; break;
case 1: $visibility = true; break;
case 2: if(LOGGED_IN && isset($cUser)) { $visibility = true; } else { $visibility = false; } break;
case 3: if(LOGGED_IN && isset($cUser)) { $visibility = false; } else { $visibility = true; } break;
}
if(!$visibility) { continue; }
$subClass = $core->output($sub['class']);
echo'<li class="'.$subClass.'"><a href="'.$core->output($sub['url']).'">'.$core->output($sub['caption'],true).'</a></li>';
}
}
echo'</ul></li>';
}
}
?>
</ul>