У меня есть две таблицы, и (промежуточная) таблица, связывающая:Связанные таблиц MySQL в PHP массивы
manufacturer car
+----+-----------+---------+ +----+----------+-------+
| id | make | founded | | id | model | debut |
+----+-----------+---------+ +----+----------+-------+
| 1 | Ford | 1903 | | 1 | Model T | 1908 |
| 2 | Chevrolet | 1911 | | 2 | Series C | 1913 |
| 3 | Honda | 1946 | | 3 | Mustang | 1962 |
| | | | | 4 | Camaro | 1966 |
| | | | | 5 | Model G | 1924 |
+----+-----------+---------+ +----+----------+-------+
manufacturer_car
+----+-----------------+--------+
| id | manufacturer_id | car_id |
+----+-----------------+--------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 4 |
+----+-----------------+--------+
Примечания: Honda не имеет какие-либо автомобилей. Модель G (Toyota) не соответствует ни одному изготовителю.
Я хотел бы создать многомерный массив в PHP этих связанных таблиц. Автомобильные матчи будут массивом в пределах массива производителя. Я не уверен, как представить, что тип массива в PHP, следующее является JSON представление:
[
{
"manufacturer": "Ford",
"founded": "1903",
"cars":[
{
"model": "Model T",
"debut": "1908"
},
{
"model": "Mustang",
"debut": "1962"
}
]
},
{
"manufacturer": "Chevrolet",
"founded": "1911",
"cars":[
{
"model": "Series C",
"debut": "1913"
},
{
"model": "Camaro",
"debut": "1966"
}
]
},
{
"manufacturer": "Honda",
"founded": "1946",
"cars":[
]
}
]
Я попытался:
$query = "SELECT
manufacturer.make,
manufacturer.founded,
car.model,
car.debut
FROM
manufacturer
LEFT JOIN manufacturer_car
INNER JOIN car
ON manufacturer_car.car_id = car.id
ON manufacturer_car.manufacturer_id = manufacturer.id";
$rows = array();
if ($result = $connection->query($query)) {
while ($row = $result->fetch_assoc()) {
$rows[] = $row;
}
}
// Print array
print_r($rows);
Но это приводит:
[0] => Array | [1] => Array
( | (
[manufacturer] => Ford | [manufacturer] => Ford
[founded] => 1903 | [founded] => 1903
[model] => Model T | [model] => Mustang
[debut] => 1908 | [debut] => 1962
) | )
Вместо того, что, я думаю, должно выглядеть так:
[0] => Array
(
[manufacturer] => Ford
[founded] => 1903
[cars] => Array
(
[0] => Array
(
[model] => Model T
[debut] => 1908
)
[1] => Array
(
[model] => Mustang
[debut] => 1962
)
)
)
Конечным результатом будет JSON, как в примере выше.
Любая помощь будет высоко оценена. Спасибо.
Спасибо, Бармар. Несколько вещей, пожалуйста, исправьте меня, если я ошибаюсь: 1) '$ rows [$ row ['manufacturer']]' должно быть '$ rows [$ row ['id']]' или другая уникальная строка. 2) final if statement 'if ($ row ['model']) {}' создает отдельный массив из текущей строки. – Mark
1) В вашем 'SELECT' нет' id', поэтому нет '$ row ['id']'. 2) Проверяет, является ли 'model'' NULL', что произойдет для производителей, у которых нет автомобилей, поэтому он не создает нулевую запись в 'cars'. – Barmar
Я не был достаточно ясен, извиняюсь. Я добавил обновление к вопросу, основанному на вашем ответе. – Mark