私の問題に対する良い答えが得られずに、フォーラムで検索を行いました。何か見逃した場合は、お気軽に質問にリンクしてください。
私がしなければならないことは単純です: カテゴリーとアイテムの完全なツリーの配列を返す関数です。私は 1 つの深さ (item と 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_catalog_items
id, cat_id, name, price
wp_catalog_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
),
...
)
),
...
);
何か不明な点があれば、お気軽にコメントしてください!
ありがとう!
編集
以下のコードを使用していくつかの変更を加えましたが、これを行うためのより適切な方法があると確信しています。1 つの DESC と 1 つの 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);
}