2011-11-22 3 views
3

즉석에서 복잡한 탐색 요소를 만드는 가장 좋은 방법을 찾고 있습니다. 나는 데이터베이스 (title, id, parentId)에있는 모든 요소들을 가지고 있으며, 그것들을 효율적으로 DB에서 가져 와서 올바르게 표시하려고합니다. 또한 활성 상태가 아닌 모든 탐색 요소를 축소하려고합니다. 따라서 "소파"를 탐색 할 경우 "샹들리에"또는 조명 아래 범주 중 하나가 표시되지 않지만 "조명"이 표시됩니다. 즉석에서 동적 탐색 만들기

내가 최종 제품의 모양을 원하는 것입니다 :
  • 거실
    • 소파
    • 의자
    • 오토만
  • 침실

    • 가구,
      • 침대
      • 협탁
  • 조명
    • 샹들리에
    • 플로어 램프
    • Sconces
  • 매트,557,개 섬유
    • 현대
    • 빈티지

내 현재의 방법은 카테고리 이름, ID 및 부모 ID의 전부를 아래로 끌어

  1. 1 개 쓰기 SQL 쿼리에게 있습니다
  2. 범주를 반복하고 하위 범주가 괄호 아래에 저장된 정렬 된 다차원 배열에 넣습니다. ts.
  3. 새로운 배열을 반복하고 HTML에게 내가 이것에 노력하고있어

(모든 종류는 기본적으로 폐쇄) 배열을 통해

  • 반복 처리를 개방 등 해당 카테고리를 표시하고 작성하는 또 다른 항목을 추가 가능한 한 적은 수의 인터 럽션으로 지금 당장 가지고있는 코드가 비효율적이라는 것을 확신합니다. 특히 2 단계에서 배열을 여러 번 반복합니다. 이 문제 (일반적인 문제)에 대한 일반적인 해결책이 있어야합니다.

  • +0

    다차원 배열을 만드는 동안 두 번째 반복 동안 적절한 범주를 열어 두지 않는 이유는 무엇입니까? – haynar

    +0

    JavaScript 또는 다른 클라이언트 측 로직을 사용하고 있습니까? 그렇지 않다면 볼 수없는 물건을 열 수 없으며 그 정보를 얻거나 처리 할 이유가 없습니다 ... – jswolf19

    답변

    2

    데이터베이스 테이블에 새로운 필드를 추가하는 것을 고려하십시오 : level.
    메인 카테고리 level 0
    하위 카테고리 level 2.
    등을 갖 level 1
    하위 서브 카테고리 것이다 것

    이 속임수는 배열의 두 번째 반복없이 비활성화 할 하위 카테고리를 파악하는 데 도움이됩니다.

    0

    저는 이것이 재귀를 사용하여 HTML 코드를 생성하는 완벽한 장소라고 생각합니다. 얼마 전이 기능을 사용했습니다. 다차원 배열 (트리)로 작업 중입니다

    function buildMenu($menu_array, $is_sub=FALSE) { 
         $attr = (!$is_sub) ? 'id="menu"' : 'class="submenu"'; 
         $menu = "<ul $attr>\n"; 
         foreach($menu_array as $id => $elements) { 
          foreach($elements as $key => $val) { 
           if(is_array($val)) { 
            $sub = buildMenu($val, TRUE); 
           } 
           else { 
            $sub = NULL; 
            $$key = $val; 
           } 
          } 
          if(!isset($url)) { 
           $url = $id; 
          } 
          $menu .= "<li><a href=\"$url\">$display</a>$sub</li>\n"; 
          unset($url, $display, $sub); 
         } 
         return $menu . "</ul>\n"; 
        } 
        echo buildMenu($menu_array); 
    

    이렇게하면 CSS 속성도 추가됩니다. 현재 활성화 된 페이지를 표시하려면 strpos() 함수를 사용하여 현재 URL을 찾을 수 있습니다. 더 많은 기능이 필요한 경우 쉽게 추가 할 수 있습니다. buildMenu()

    위의 대답에서 언급 한 수준을 사용하면 도움이 될 것입니다. 데이터베이스에서 중첩 세트 모델을 사용하고 있다면 전체 메뉴 데이터를 반환하는 단일 선택 인 내 쿼리를 도울 수 있습니다.