2014-01-30 2 views
0

HTMLi 메뉴 및 하위 메뉴를 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 추가 한 대시 자리를 얻을 수 있도록이 예제에서, 당신은 recursiveness
편집에 당신의 방법을 찾을 수있는 방법을 보여줍니다 : 작지만 중요한 참고 사항 : 이것은 아동을 차일드에 계속 추가하면 끝날 것입니다 ..., 코드를 업데이트 할 필요가 없습니다. 그 재귀의 위대한 힘 중 하나입니다

+0

감사합니다 그것은 매력처럼 작동합니다! ;) –

+0

오늘 재귀 시스템에서 작업하므로 내 머리 꼭대기에 아무런 문제가 없었습니다. – Martijn

0

위의 답변은 내가 원하는 것보다 더 나은 하루지만, 내가 select2와 여러 선택 옵션으로 그런 목록을 채우고 붙어있어 하나 기억, 그리고 다시 부트 스트랩 ul 리 시스템, 필요하다면 다른 방법으로 배열하기 위해 어레이에 메뉴 시스템이 필요할 수 있습니다. 해피 코딩! :)

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

더 이상 동의 할 수 없습니다! for 및 while은 foreach보다 더 빠르고 효율적입니다. :) –