В моем навигационном меню в настоящее время имеется две петли foreach; первая отобразит все родительские ссылки навигации, а вторая отобразит суб-навигационные ссылки.PHP - эффективность цикла 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>
Да несколько примеров можно было бы замечательно, :) – zuc0001
ОК, только первый подтвердите, пожалуйста, если я понял правильно - когда parent_id = -1, то уровень первого уровня - правильно? –
Это правильно :) Все, что больше -1, является подпунктом соответствующего родителя. – zuc0001