Групирование двух масивов в один (масива категорий и масива данных)

Прошу помочь в следующем вопросе:

У меня есть страница на которой выводятся задания для выполнения, я захотел выводить для них название их категории, картинку и может еще какие то данные с базы. (ну и собственно что бы они были сгруппированы по этой категории).

Есть несколько таблиц но здесь фигурируют лишь две, (их содержимое так же описано вкратце только то что может быть важно для понимания):

bounty:
id
title
id_category

bounty_category:
id
title

выводить планирую подобной конструкцией (упрощено):

{% for category in group_category %}
     <h1>Категория {{ items.title }}</h1> {# Название текущей категории которая размещает в себе список заданий #}
     {% for item in category %}
     <p>{{ item.title }}</p> {# здесь список заданий в данной категории #}

{% endfor %}
{% endfor %}

Массив данных должен получиться в таком виде:

$result = array(
            '' =>
                array(
                    'title' => 'Категория Test',
                    '1' =>
                        array(
                            'title' => 'Задание test',
                            'id_category' => 1
                        ),
                    '2' =>
                        array(
                            'title' => 'Задание test2',
                            'id_category' => 1
                        ),
                    '3' =>
                        array(
                            'title' => 'Задание test3',
                            'id_category' => 1
                        )
                ),
            array(
                'title2' => 'Категория Test2',
                '1' =>
                    array(
                        'title' => 'Задание test4',
                        'id_category' => 2
                    ),
                '2' =>
                    array(
                        'title' => 'Задание test5',
                        'id_category' => 2
                    ),
                '3' =>
                    array(
                        'title' => 'Задание test6',
                        'id_category' => 2
                    )
            )
        );

У меня пока слабо с складыванием подобных данных, пока получилось сделать лишь в двух видах:

Выводиться много пустых блоков в цикле и с дублирующими заданиями, но с заголовком категории и заданиями в ней (правда дублирующимися).

Либо же выводе первой категории и первого задания в ней.

Буду очень признателен если кто поможет мне решить эту задачу, или подскажет как это сделать.


Ответы (1 шт):

Автор решения: Roman Lytvynov

Сделайте запрос в БД используя JOIN:

SELECT 
  bounty.id, 
  bounty.title, 
  bounty.id_category,
  bounty_category.title as cat_title
FROM bounty
JOIN bounty_category ON bounty.id_category = bounty_category.id
ORDER BY bounty.id_category;

На выходе получите массив, элементы которого будут иметь поля id, title, id_category, cat_title. Далее нужно пройтись по этому массиву, чтобы получить нужную Вам структуру.

$result = [];
foreach ($data as $element) {
    $catId = $element['id_category'];
    $catTitle = $element['cat_title'];
    $result[$catId]['title'] = $catTitle;
    $result[$catId]['bounties'][] = $element;
}

Обратите внимание, что награды вынесены в отдельное поле в массиве $result - bounties.

UPD Пример без JOIN, когда есть массивы bounties и bounty_categories

$result = array_map(function($cat) {
    $cat['bounties'] = array_filter($bounties, function($b) {
        return $b['id_category'] = $cat['id_category'];
    });

    return $cat;
}, $bounty_categories);
→ Ссылка