Как группировать данные массива, возвращаемые левым запросом соединения в php?

У меня следующие 2 таблицы со следующими значениями:


tbl_brand

id name

1 Apple

2 Samsung


tbl_products

id brand_id p_name

1 1 Мобильный

2 1 Earpods

3 2 Мобильный


Здесь, когда я использую левый запрос соединения, ie

SELECT 'b'.'id' as 'brand_id', 'b'.'name' as 'brand_name', 'p'.'p_name' as 'product_name' FROM 'tbl_brand' 'b' LEFT JOIN 'tbl_products' 'p' ON 'p'.'brand_id' = 'b'.'id'

и напечатать результат, я получаю следующий массив:

 Array ( [0] => stdClass Object ( [brand_id] => 1 [brand_name] => Apple [product_name] => Mobile ) [1] => stdClass Object ( [brand_id] => 1 [brand_name] => Apple [product_name] => Earpods ) [2] => stdClass Object ( [brand_id] => 2 [brand_name] => Samsung [product_name] => Mobile ) 

Все работает нормально. Но результат, который я ищу, выглядит примерно так:

 Array ( [0] => stdClass Object ( [brand_id] => 1 [brand_name] => Apple [product_name] => stdClass Object ( [0] => Mobile [1] => Earpods ) ) [1] => stdClass Object ( [brand_id] => 2 [brand_name] => Samsung [product_name] => Mobile ) 

Я хочу сгруппировать данные в соответствии с ключом brand_id . Как я могу это сделать ?

Хотя вы можете генерировать нужный массив в одном цикле, я предпочел бы выполнить два запроса. Сначала выберите все бренды в массив и добавьте пустой массив продуктов для каждой марки. Затем загрузите все продукты и назначьте их соответствующему бренду.

Поскольку я не знаю, какую библиотеку БД вы используете, вот какой-то псевдокод:

 $data = []; $brandResult = $db->query("SELECT id, name FROM tbl_brand"); while ($row = $brandResult->fetchObject()) { $row->product_names = []; $data[$row->id] = $row; } $productResult = $db->query("SELECT id, brand_id, p_name FROM tbl_products"); while ($row = $productResult->fetchObject()) { $data[$row->brand_id][$row->id] = $row->p_name; } 

mysql возвращает строки, поэтому, если вам нужен многомерный массив, вы должны сами его построить. Петля вдоль этих строк будет делать это:

 $array=array(); foreach ($result as $row) { $array[$row->brandid]['brandid'] = $row->brandid; $array[$row->brandid]['brand_name'] = $row->brand_name; $array[$row->brandid]['products'][] = $row->product; }