PHP/MYSQL- NAV 메뉴 계층 구축 구축
문제
따라서 최종 메뉴는 다음과 같이 보입니다.
Item B
Item B-1
Item B-1-2
Item B-1-1
Item A
SubItem A-1
SubItem A-2
Item C
다음 DB 레코드를 기반으로 :
id menu_title parent_menu_id menu_level weight
1 Item A 0 1 1
2 Item B 0 1 0
3 Item C 0 1 2
4 SubItem A-2 1 2 1
5 Item B-1 2 2 0
6 Item B-1-1 5 3 1
7 SubItem A-1 1 2 0
8 Item B-1-2 5 3 0
어떻게 표시할까요? 내 생각에 모든 항목을 다차원 배열에 저장 한 다음 어떻게 든 반복하는 것입니다 ...
해결책
데이터 구조를 다루는 것은 종종 재귀 또는 여러 쿼리를 포함하여 트리를 만들 수 있습니다.
계층 구조를 저장하는 다른 방법을 고려해 보셨습니까? 수정 된 선주문 트래버살 확인 - 여기에 좋은 것이 있습니다. 이것에 대한 PHP 기반 기사.
다른 팁
계층 적 데이터는 관계 데이터베이스에서 다소 성가시다 (운영자가있는 Oracle 제외 START WITH/CONNECT BY
이것을 다루기 위해). 기본적으로 있습니다 두 가지 모델: 인접력 목록 및 중첩 세트.
당신은 인접력 세트를 선택했습니다. 이것이 제가 일반적으로하는 것입니다. 중첩 된 세트 모델보다 변경하는 것이 훨씬 쉽지만 중첩 세트 모델은 단일 쿼리에서 올바른 순서로 검색 할 수 있습니다. 인접력 목록은 될 수 없습니다. 중간 데이터 구조 (트리)를 구축 한 다음이를 목록으로 변환해야합니다.
내가 할 일은 (그리고 최근에했던 것) :
- 부모 ID에서 주문한 한 쿼리에서 전체 메뉴 내용을 선택하십시오.
- 연관 배열 또는 클래스/객체를 사용하여 메뉴 구조의 트리를 구축하십시오.
- 그 나무를 걸어 중첩되지 않은 목록을 만듭니다. 그리고
- jQuery 플러그인을 사용하십시오 슈퍼 피쉬 그 목록을 메뉴로 바꾸려면.
당신은 다음과 같은 것을 구축합니다.
$menu = array(
array(
'name' => 'Home',
'url' => '/home',
),
array(
'name' => 'Account',
'url' => '/account',
'children' => array(
'name' => 'Profile',
'url' => '/account/profile',
),
),
// etc
);
그리고 이것으로 변환하십시오.
<ul class="menu">;
<li><a href="/">Home</a></li>
<li><a href="/account">Account Services</a>
<ul>
<li><a href="/account/profile">Profile</a></li>
...
메뉴 배열을 생성하기위한 PHP는 합리적으로 간단하지만 해결하기가 약간 Finnicky입니다. HTML 중첩 목록 마크 업을 구축하는 재귀적인 트리 워크 기능을 사용하지만 독자를위한 연습으로 구현됩니다. :)
계층 적 데이터 저장 방식은 원하는만큼 효율적이지 않습니다. 나는 기사를 읽었다 MySQL에서 계층 적 데이터 관리 몇 년 전에 그만큼 SQL에서 계층 구조 기반 데이터를 관리하는 최상의 솔루션. 다음으로 가장 좋은 혜택은 하나의 쿼리로 전체 나무를 잡을 수 있다고 생각합니다.
방금 비슷한 질문에 MySQL 계층 데이터 (인접 목록)를 메뉴 (HTML)로 변환하기위한 내 자신의 접근 방식을 방금 게시했습니다.
그렇습니다 ~ 아니다 재귀를 사용하십시오. 그리고 그것은 필요합니다 단일 쿼리 데이터베이스에.
더 읽어보십시오
https://stackoverflow.com/questions/2871861#3368622
감사.
중첩 세트를 사용하지 않으려면 계층 구조를 생성 할 수있는 또 다른 간단한 방법은 앞에 간단한 텍스트 문자열을 사용하는 것입니다.
Item B
Item B-1
Item B-1-2
Item B-1-1
Item A
SubItem A-1
SubItem A-2
Item C
될 것입니다
1 Item B
1.1 Item B1
1.1.1 Item B11
1.1.2 Item B12
2 Item A
2.1 Item A1
2.2 Item B2
3 Item C
각 항목 앞의 숫자는 필드에 저장되고 길이 (위치의 깊이를 나타내는)에 따라 구문 분석하여 어디로 가는지 알아야 할 모든 것을 알려줍니다.
나는 계산이 필요한 더 복잡한 물건을 위해 중첩 된 세트 계층을 사용하지만이 접근법은 잘 작동했다는 것을 알았습니다.