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