2014-01-30 3 views
0

Я пытаюсь вывести HTML-меню и подменю с MySQLi и PHP.Выходное меню с подменю с использованием php и mysqli

Мой опыт не достаточно, чтобы решить этот вопрос.

Могу ли я помочь?

У меня есть следующая структура таблицы страниц:

CREATE TABLE `pages` (
    `id` int(100) NOT NULL AUTO_INCREMENT, 
    `page_name` varchar(255) NOT NULL, 
    `parent_id` int(100) NOT NULL, 
    `link` varchar(255) NOT NULL, 
    `target` varchar(255) NOT NULL, 
    `enabled` int(1) NOT NULL DEFAULT '1', 
    `sort` int(100) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=utf8; 

Записи:

INSERT INTO `pages` VALUES ('1', 'Home', '0', 'index.php', '_self', '1', '1'); 
INSERT INTO `pages` VALUES ('2', 'Team', '0', 'team.php', '_self', '1', '2'); 
INSERT INTO `pages` VALUES ('3', 'Posts', '0', 'posts.php', '_self', '1', '3'); 
INSERT INTO `pages` VALUES ('4', 'Programs', '0', 'programs.php', '_self', '1', '4'); 
INSERT INTO `pages` VALUES ('5', 'Program Name 1', '4', 'program1.php', '_self', '1', '1'); 
INSERT INTO `pages` VALUES ('6', 'Program Name 2', '4', 'program2.php', '_self', '1', '2'); 
INSERT INTO `pages` VALUES ('7', 'Program Name 3', '4', 'program3.php', '_self', '1', '3'); 
INSERT INTO `pages` VALUES ('8', 'Contact', '0', 'contact.php', '_self', '1', '8'); 

Моя цель состоит в том, чтобы вывести что-то вроде этого:

Home 
Team 
Posts 
Programs 
--Program Name 1 
--Program Name 2 
--Program Name 3 
Contact 

Благодаря

+0

Есть ли два стола или один? – hjpotter92

+0

Только один. Спасибо –

ответ

2

Я собираюсь оставить детали себе, но это будет что-то вроде этого. рекурсивного является ключевым словом:

function getMenu($parent=0, $depth=0){ 
    $menu = "<ul>"; // each section gets wrapped in UL 
    // Select and query to get only the direct childs from $parent: 
    $qItems = "SELECT id, page_name FROM pages WHERE parent=".$parent; 
    $sItems = mysqli_query($conn, $qItems); 
    // This will be the magic part: 
    while($fItems = $sItems->fetch_assoc()){ 
     $menu.= '<li>'; 
     $menu.= str_repeat('-', $depth).' '.$fItems['page_name']; 
     $menu.= getMenu($fItems['id'], $depth+1); // <- this is the magic! This will get the childs of this item 
     $menu.= '</li>'; 
    } 

    $menu.= "</ul>"; // each section gets wrapped in UL 
    return $menu; // return it 
} 

echo getMenu(); // Do something with it :) 

Я добавил $depth в этом примере, так черточка получить место, чтобы показать, как вы можете найти свой путь в рекурсивность
Edit: Небольшое, но важное замечание: Это будет продолжаться бесконечно, если вы будете продолжать добавлять детей к детям ..., нет необходимости обновлять код. Это одна из великих возможностей рекурсивности.

+0

Спасибо, что это работает как шарм! ;) –

+0

Работа над рекурсивными системами сегодня, так что это было в моей голове, без проблем :) – Martijn

0

Ответ выше, в любой день лучше, чем у меня, но я помню, что я застрял в заполнении такого списка, как опция множественного выбора, с помощью select2, а затем снова с системой bootstrap ul li, Иногда вам может понадобиться система меню в массивах, чтобы заполнить по-другому, просто на случай, если вам нужно. Счастливое кодирование! :)

while($data = $mysqli_result->fetch_assoc()) 
{ 
    if ($data['parentId'] == 0) 
    $menu[$data['id']] = $data['page_name']; 
    else 
    $subMenu[$data['parentId']][$data['id']]=$data['page_name']; 
} 
foreach($menu as $k=>$m) 
{ 
    //echo $m here as you like..! 
    if(isset($submenu[$k])) 
    { 
     foreach($submenu[$k] as $sub) 
     { 
      //do with the submenu. 
     } 
    } 
} 
+0

Вместо этого (медленный! PHP и массивы медленны, когда в больших наборах данных!) Вы могли бы просто создать новый в то время как в то время как ... Тот же эффект, но быстрее. – Martijn

+0

Не могу договориться подробнее! для и в то время как в любой день быстрее и намного эффективнее, чем foreach! :) –

Смежные вопросы