1

私の問題に対する良い答えが得られずに、フォーラムで検索を行いました。何か見逃した場合は、お気軽に質問にリンクしてください。

私がしなければならないことは単純です: カテゴリーとアイテムの完全なツリーの配列を返す関数です。私は 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);
}
4

1 に答える 1

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 ループに pop を追加するのを忘れていました!

2 番目の更新: 逆順を問題にしたくない場合は、array_pop の代わりに array_shift を使用してください...

于 2010-07-06T19:51:35.863 に答える