문제

따라서 최종 메뉴는 다음과 같이 보입니다.

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

각 항목 앞의 숫자는 필드에 저장되고 길이 (위치의 깊이를 나타내는)에 따라 구문 분석하여 어디로 가는지 알아야 할 모든 것을 알려줍니다.

나는 계산이 필요한 더 복잡한 물건을 위해 중첩 된 세트 계층을 사용하지만이 접근법은 잘 작동했다는 것을 알았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top