PS. Jeg har søgt efter lignende problemstillinger uden held. Ved du tilfældigvis, eller er du bedre end mig til at søge, vil jeg blive lige så glad for et link. :-)
Hvilken løsning du skal bruge, kommer nok an på hvor mange niveauer din menu er/kan være i.
Min løsning til en menu i 2 niveauer er således:
<?php // Array to hold the menu $mainmenu = array();
// Get all menu-items from DB $sql = ' select * from menus order by parent_id asc, weight asc;'; $db->query($sql);
// Loop through results, if any if ($db->num_rows()){ while ($row = $db->fetch_object()){ // If no parent if ($row->parent_id == 0){ // Create as parent in the menu array $mainmenu[$row->id] = array( 'title' => $row->title, 'url' => $row->url ); } else{ // Create as child of the parent in the menu array if (!isset($mainmenu[$row->parent_id]['submenu'])){ $mainmenu[$row->parent_id]['submenu'] = array(); } $mainmenu[$row->parent_id]['submenu'][$row->id] = array( 'title' => $row->title, 'url' => $row->url ); } } }
<?php // Array to hold the menu $mainmenu = array();
// Get all menu-items from DB $sql = ' select * from menus order by parent_id asc, weight asc;'; $db->query($sql);
// Loop through results, if any if ($db->num_rows()){ while ($row = $db->fetch_object()){ // If no parent if ($row->parent == 0){ // Create as parent in the menu array $mainmenu[$row->id] = array( 'title' => $row->title, 'url' => $row->url ); } else{ // Create as child of the parent in the menu array if (!isset($mainmenu[$row->parent]['submenu'])){ $mainmenu[$row->parent]['submenu'] = array(); } $mainmenu[$row->parent]['submenu'][$row->id] = array( 'title' => $row->title, 'url' => $row->url ); } } }
Derefter kan du så (der hvor du gerne vil vise din menu), blot loope igennem $mainmenu-array'et:
<?php // Loop igennem "hoved"-menupunkter foreach ($mainmenu as $menu){ // Vis "hoved"-menupunktet echo '<a href="'.$menu['url'].'">'.$menu['title'].'</a>'; // Tjek om der er "under"-menupunkter if (isset($menu['submenu']) && count($menu['submenu'])){ // Loop igennem "under"-menupunkter foreach ($menu['submenu'] as $submenu){ // Vis "under"-menupunktet echo '<a href="'.$submenu['url'].'">'.$submenu['title'].'</a>'; } } } ?>
Dog kunne jeg godt forestille mig at du vil have udskrevet dig menu på en anderledes måde, men det vil jeg lade dig om.
Hvis du stadig ikke helt er med, så må du gerne uddybe lidt hvad det er du er i tvivl om / ikke helt forstår, eventuelt hvilke fejl du får, hvis du får nogen. Eller komme med det kode du har fået strikket sammen.
Som blot var et eksempel på hvordan dit array kunne se ud, efter du havde hentet den ud af databasen...
Det jeg gerne vil vide, er om denne stump kode fungere, efter du har omskrevet den til din tabel osv, eller om den fejler, samt hvilke fejl du får.
<?php // Connect to the database mysql_connect($host, $user, $pass); mysql_select_db($database);
// Array to hold the menu $mainmenu = array();
// Get all menu-items from DB $sql = ' select * from menus order by parent_id asc, weight asc;'; $query = mysql_query($sql);
// Loop through results, if any if (mysql_num_rows($query)){ while ($row = mysql_fetch_object($query)){ // If no parent if ($row->parent == 0){ // Create as parent in the menu array $mainmenu[$row->id] = array( 'title' => $row->title, 'url' => $row->url ); } else{ // Create as child of the parent in the menu array if (!isset($mainmenu[$row->parent]['submenu'])){ $mainmenu[$row->parent]['submenu'] = array(); } $mainmenu[$row->parent]['submenu'][$row->id] = array( 'title' => $row->title, 'url' => $row->url ); } } }
// Loop through main menu foreach ($mainmenu as $menu){ // Show main menu echo '<a href="'.$menu['url'].'">'.$menu['title'].'</a>'; // Check for sub menus if (isset($menu['submenu']) && count($menu['submenu'])){ // Loop through sub menus foreach ($menu['submenu'] as $submenu){ // Show sub menu echo '<a href="'.$submenu['url'].'">'.$submenu['title'].'</a>'; } } } ?>
// Get all menu-items from DB $sql = ' select * from sider order by parent asc;'; $query = mysql_query($sql);
// Loop through results, if any if (mysql_num_rows($query)){ while ($row = mysql_fetch_object($query)){ // If no parent if ($row->parent == 0){ // Create as parent in the menu array $mainmenu[$row->id] = array( 'title' => $row->title, 'url' => $row->url ); } else{ // Create as child of the parent in the menu array if (!isset($mainmenu[$row->parent]['submenu'])){ $mainmenu[$row->parent]['submenu'] = array(); } $mainmenu[$row->parent]['submenu'][$row->id] = array( 'title' => $row->title, 'url' => $row->url ); } } }
// Loop through main menu foreach ($mainmenu as $menu){ // Show main menu echo '<li><a href="'.$menu['url'].'">'.$menu['title'].'</a>'; // Check for sub menus if (isset($menu['submenu']) && count($menu['submenu'])){ // Loop through sub menus echo '<ul>'; foreach ($menu['submenu'] as $submenu){ // Show sub menu echo '<li><a href="'.$submenu['url'].'">'.$submenu['title'].'</a></li>'; } echo '</ul>'; } echo '</li>'; }
Hvorfor er det i øvrigt man ikke bare kan bruge et par while-løkker for hver 'level' der er i menuen. Jeg er sikker på det er en logisk forklaring jeg overser, men jeg kan bare ikke lige regne det ud?
Hvis man nu kun har ét level/niveau i menuen, kan den jo hentes med en simpel while-løkke. Hvordan kan man så ikke bare smide én til while-løkke ind i den første, som henter undersiderne?
Det kan du skam også godt, men så ender du bare med at skulle lave en forespørgsel mere til databasen, for hvert menupunkt du har.
Altså sådan som jeg har lavet det her, så laver du én forespørgsel til databasen, og sorterer så bare resultaterne, for at bygge din menu.
Hvis man laver det som du snakker om, så skal du lave en forespørgsel for at hente menu-punkter for niveau 1, samt en forespørgsel for hvert menupunkt. Så hvis du har 10 menu-punkter i niveau 1, så bliver det til 11 forespørgelser i alt.
Og forespørgelserne vokser så kun hvis du skal have flere niveauer i din menu.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.