Я сделал некоторый поиск на форуме без любых хороших ответов для моей проблемы. Если я пропустил что-то, не стесняйтесь связывать меня с вопросом!
То, что я должен сделать, просто: функция, которая возвращает массив полного дерева моих категорий и объектов. У меня только есть 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_catering_items
id, cat_id, name, price
wp_catering_cats
id, name
Вот является exemple массивом результатов, который я хочу:
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);
}
Если вы просто пытаетесь оптимизировать, то сделайте простую вещь: вместо того, чтобы захватывать только элементы для конкретного кота, на котором вы находитесь, захватите все элементы сразу и упорядочьте их по 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.
}
}
Обновление: Спасибо за комментарий... Забыл добавить pop в цикл while!
Второе обновление: используйте array_shift вместо array_pop, если не хотите, чтобы обратное упорядочивание было проблемой...