категории и предметы 1 большой массив - PullRequest
1 голос
/ 06 июля 2010

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

Что мне нужно сделать, так это просто: функция, которая возвращает массив полного дерева моих категорий и элементов.У меня есть только 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
                            ),
                        ...

                    )

            ),
           ...
   );

Если что-то не понятно, не стесняйтесь комментировать!

Спасибо!

EDIT

Я сделал несколько модификаций, используя приведенный ниже код, но я почти уверен, что есть более удобный способ сделать это.Заказывать один 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 Ответ

2 голосов
/ 06 июля 2010

Если вы просто пытаетесь оптимизировать, то сделайте простую вещь, вместо того, чтобы просто брать предметы для конкретной кошки, на которой вы находитесь, хватайте все предметы сразу и упорядочивайте их по 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, если вы не хотите, чтобы обратный порядок был проблемой ...

...