категории и объекты 1 большой массив

Я сделал некоторый поиск на форуме без любых хороших ответов для моей проблемы. Если я пропустил что-то, не стесняйтесь связывать меня с вопросом!

То, что я должен сделать, просто: функция, которая возвращает массив полного дерева моих категорий и объектов. У меня только есть 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);
}
1
задан allaire 6 July 2010 в 20:29
поделиться

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.

    }
}

Обновление: Спасибо за комментарий... Забыл добавить pop в цикл while!

Второе обновление: используйте array_shift вместо array_pop, если не хотите, чтобы обратное упорядочивание было проблемой...

2
ответ дан 2 September 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: