类别和项目1大数组

时间:2010-07-06 19:44:05

标签: mysql wordpress arrays categories items

我在论坛上搜索了一些没有任何问题的好答案。如果我错过了什么,请随时将我与问题联系起来!

我需要做的很简单:一个函数返回我的类别和项目的完整树的数组。我只有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_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
                            ),
                        ...

                    )

            ),
           ...
   );

如果不清楚,请随时发表评论!

谢谢!

修改

我使用下面的代码进行了一些修改,但我确信有一种更简洁的方法可以做到这一点。不得不订购一个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);
}

1 个答案:

答案 0 :(得分: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!

第二次更新:如果您不希望反向排序成为问题,请使用array_shift而不是array_pop ...