我的導航菜單目前有兩個foreach循環;第一個將顯示所有父導航鏈接,第二個顯示子導航鏈接。PHP - foreach循環的效率
我正在尋找一種方法來更改第二個foreach循環,只循環通過相關的子導航項,而不是通過檢查每個父項的每個導航。
什麼是最好的方式去做這件事?
CODE:
<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>
呀一些例子可能將是巨大的,:) – zuc0001
OK,只有首先確認請,如果我理解正確的 - 當PARENT_ID = -1,那麼它是第一級 - 對吧? –
這是正確的:) 大於-1的任何項都是相應父項的子項。 – zuc0001