【发布时间】:2015-07-12 18:52:43
【问题描述】:
我的导航菜单目前有两个 foreach 循环;第一个将显示所有父导航链接,第二个显示子导航链接。
我正在寻找一种方法将第二个 foreach 循环更改为仅循环遍历相关的子导航项,而不是检查每个父项的 每个 导航。
解决此问题的最佳方法是什么?
代码:
<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>
【问题讨论】:
标签: php mysql pdo mysqli foreach