2010-07-06 5 views
1

나는 내 문제에 대한 좋은 답변없이 포럼에서 검색을 수행했습니다. 내가 뭔가를 놓친 경우, 저를 질문에 연결해주십시오!카테고리 및 항목 1 큰 배열

내가해야 할 일은 간단합니다 : 내 범주 및 항목의 전체 트리 배열을 반환하는 함수입니다. 1 깊이 (항목 및 cat_id) 만 있으므로 재귀가 필요 없습니다 (재귀 적 솔루션이있는 경우 기꺼이 받아 들일 수는 있지만).

오른쪽 지금, 내가 이런 짓을했지만, 나는 여러 쿼리를 수행하기 때문에이 꽤 나쁜는 ...

function build_tree() 
{ 
    global $wpdb; 

    $cats = $wpdb->get_results("SELECT * FROM wp_catering_cats"); 


    foreach($cats as &$cat) 
    { 
     $id = $cat->id; 

     $cat->items = $wpdb->get_results("SELECT * FROM wp_catering_items WHERE cat_id = $id"); 
    } 

    return $cats; 
} 

내 테이블은 정말 간단하다 :

wp_catering_items

id, cat_id, name, price 

wp_catering_cats

id, name 
뭔가 명확하지 않으면

Array 
    (
     [0] => array 
      (
       [id] => 1 
       [name] => Cat #1 
       [items] => Array 
        (
         [0] => array 
          (
           [id] => 1 
           [cat_id] => 1 
           [name] => Item #1 
           [price] => 5 
          ), 
         ... 

        ) 

      ), 
      ... 
    ); 

는 의견을 주시기 바랍니다 :

다음은 결과 배열이 내가하려는 exemple입니다!

감사합니다.

편집

나는 코드 울부 짖는 소리를 사용하여 일부 수정했습니다,하지만 난이 할 수있는 깔끔한 방법이 확신 '. 하나 DESC 한 ASC를 주문하고있는 것은 바로 소리하지 않습니다 ..

function build_tree() 
{ 
    global $wpdb; 

    $cats = $wpdb->get_results("SELECT * FROM wp_catering_cats ORDER BY id DESC"); 
    $items = $wpdb->get_results("SELECT * FROM wp_catering_items ORDER BY cat_id ASC"); 

    $item = array_pop($items); 

    foreach($cats as &$cat) 
    { 
     while($item->cat_id == $cat->id) 
     { 
      $cat->items[] = $item; 
      $item = array_pop($items); 
     } 
    } 

    print_r($cats); 
} 

답변

2

그냥 그 간단한 일을, 최적화하기 위해 노력하고, 대신의 당신이있는 특정 고양이에 대한 항목을 잡는 경우 한번에 모든 항목을 잡고 catID로 주문하십시오. 그런 다음 고양이를 반복하고 다음 고양이를 칠 때까지 항목 결과에서 항목을 팝합니다.

function build_tree() 
{ 
    global $wpdb; 

    $cats = $wpdb->get_results("SELECT * FROM wp_catering_cats order by cat_id asc"); 
    $items = $wpdb->get_results("SELECT * FROM wp_catering_items ORDER BY cat_id asc"); 

    foreach($cats as &$cat) 
    { 
     $id = $cat->id; 
     $item = array_pop($items) 
     while($item['cat_id'] == $id) 
     { 
     $cats->item[] = $item; 
     $item = array_pop($items) 
     } 
     #do a little bookkeeping so you next cat gets its first item, and zero item cats get skipped. 

    } 
} 

업데이트 : 의견을 주셔서 감사합니다. while 루프에 팝을 추가하는 것을 잊어 버렸습니다!

두 번째 업데이트 : 당신은 문제가 주문 반대하지 않으려면 대신 array_pop의 array_shift 사용 ...

+0

BY ORDER없이 쿼리를 실행하고 만들 빨리해야 배열 $ catsById [$ 만일 catId] = $ cat; ID로 카테고리에 쉽게 액세스 할 수 있도록합니다. – Naktibalda

+0

반복마다 항목을 한 번만 팝합니까? 이 모양 때문에 무한 루프가 발생합니다. – allaire

+0

내 게시물에서 EDIT를 보아라. foreach 밖에서 먼저 팝업해야한다. 그렇지 않으면 새로운 고양이의 첫 번째 항목 (while 루프에서 파손 된 항목)이 튀어 나와야한다. 또한 foreach는 처음부터 시작되므로 DESC 범주를 정렬해야합니다.이 작업을 수행하는 데 더 깔끔한 방법이 있어야합니다. o하지만 확실히이 솔루션은 내가 처음 사용하는 것보다 낫습니다. – allaire