2010-07-06 11 views
1

J'ai fait une recherche sur le forum sans aucune bonne réponse à mon problème. Si j'ai raté quelque chose, n'hésitez pas à me lier à la question! Ce que je dois faire est simple: une fonction qui renvoie un tableau de l'arbre complet de mes catégories et éléments. Je n'ai que 1 depth (item et un cat_id), donc pas de récursion impliquée (bien que si vous avez une solution récursive, je l'accepte volontiers).catégories et articles 1 grand tableau

En ce moment, je l'ai fait, mais il est assez mauvais, puisque je fais plusieurs requêtes ...

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; 
} 

Mes tableaux sont très simples:

wp_catering_items

id, cat_id, name, price 

wp_catering_cats

id, name 

Voici un exemple du tableau des résultats que je veux:

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

        ) 

      ), 
      ... 
    ); 

Si quelque chose n'est pas clair, ne hésitez pas à commenter!

Merci!

EDIT

J'ai fait quelques modifications en utilisant le code ci-dessous, mais je assez sûr qu'il ya un moyen plus propre de le faire. Le fait de devoir commander un et un ASC DESC ne sonne juste pas juste ..

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); 
} 

Répondre

2

Si vous essayez juste d'optimiser, puis faire la chose simple, au lieu de seulement saisir les éléments pour le chat spécifique que vous êtes sur , saisissez tous les objets à la fois, et commandez-les par catID. Puis faites défiler vos chats et faites ressortir les objets de vos résultats jusqu'à ce que vous atteigniez le chat suivant.

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. 

    } 
} 

Mise à jour: Merci pour le commentaire .. avez oublié d'ajouter la pop dans la boucle while!

Deuxième mise à jour: utiliser array_shift au lieu de array_pop si vous ne voulez pas inverser la commande d'un problème ...

+0

Il devrait être plus rapide pour exécuter des requêtes sans ORDER BY et créer une matrice catsById $ [de catId $] = $ cat; pour faciliter l'accès à la catégorie par identifiant. – Naktibalda

+0

Vous ne faites apparaître l'article qu'une fois par itération? Parce qu'il semble que cela va provoquer une boucle infinie. – allaire

+0

Regardez l'EDIT dans mon post, vous devez d'abord sortir en dehors de la foreach sinon vous ferez tomber le premier élément de vos nouveaux chats (celui qui a cassé dans la boucle while). Aussi, puisque le foreach commence depuis le début, vous devez commander les catégories DESC ... Il doit y avoir une façon plus simple de faire ceci: o Mais à coup sûr, cette solution est encore meilleure que la première que j'ai eue ... – allaire

Questions connexes