我在论坛上搜索了一些没有任何问题的好答案。如果我错过了什么,请随时将我与问题联系起来!
我需要做的很简单:一个函数返回我的类别和项目的完整树的数组。我只有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);
}
答案 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 ...