类别和项目 1 个大数组
Posted
技术标签:
【中文标题】类别和项目 1 个大数组【英文标题】:categories and items 1 big array 【发布时间】:2011-03-12 12:05:06 【问题描述】:我在论坛上进行了一些搜索,但我的问题没有任何好的答案。如果我遗漏了什么,请随时将我链接到问题!
我需要做的很简单:返回一个包含我的类别和项目的完整树的数组的函数。我只有 1 个深度(项目和 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_餐饮项目
id, cat_id, name, price
wp_餐饮猫
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】:如果你只是想优化,那就做简单的事情,而不是只为你所在的特定猫抓取物品,一次抓取所有物品,并按 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 循环中添加弹出!
第二次更新:如果您不希望反向排序成为问题,请使用 array_shift 而不是 array_pop...
【讨论】:
在没有 ORDER BY 的情况下运行查询并创建数组 $catsById [$catId] = $cat; 应该更快以便通过 id 访问类别。 您每次迭代只弹出一次该项目?因为看起来这样会导致无限循环。 查看我帖子中的 EDIT,您必须先弹出 foreach 之外,否则您将弹出新猫的第一项(在 while 循环中中断的项)。另外,由于 foreach 从头开始,您需要对类别 DESC 进行排序......必须有一种更简洁的方法来做到这一点:o 但可以肯定的是,这个解决方案仍然比我的第一个解决方案更好......跨度>以上是关于类别和项目 1 个大数组的主要内容,如果未能解决你的问题,请参考以下文章