2016-03-22 3 views
1

У меня есть две таблицы, и (промежуточная) таблица, связывающая:Связанные таблиц 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

Было бы проще, если бы вы сделали массив результатов ассоциативным массивом, ключи которого являются производителями.

Buty Основная проблема заключается в том, что вам необходимо добавить информацию о машине в элемент cars элемента массива в пределах элемента, соответствующего конкретному изготовителю.

$rows = array(); 
while ($row = $row->fetch_assoc()) { 
    if (!isset($rows[$row['make']])) { 
     $rows[$row['make']] = array(
      'manufacturer' => $row['make'], 
      'founded' => $row['founded'], 
      'cars' => array() 
     ); 
    } 
    if ($row['model']) { 
     $rows[$row['make']]['cars'][] = array(
      'model' => $row['model'], 
      'debut' => $row['debut'] 
     ); 
    } 
} 

Если вы хотите индексированный массив вместо ассоциативно, вы можете сделать:

$rows = array_values($rows); 

после цикла.

+0

Спасибо, Бармар. Несколько вещей, пожалуйста, исправьте меня, если я ошибаюсь: 1) '$ rows [$ row ['manufacturer']]' должно быть '$ rows [$ row ['id']]' или другая уникальная строка. 2) final if statement 'if ($ row ['model']) {}' создает отдельный массив из текущей строки. – Mark

+0

1) В вашем 'SELECT' нет' id', поэтому нет '$ row ['id']'. 2) Проверяет, является ли 'model'' NULL', что произойдет для производителей, у которых нет автомобилей, поэтому он не создает нулевую запись в 'cars'. – Barmar

+0

Я не был достаточно ясен, извиняюсь. Я добавил обновление к вопросу, основанному на вашем ответе. – Mark

-1

Я считаю, что то, что вы хотите, не представляется возможное с помощью операторов SQL из-за способом, соединяющую работу, но вы можете обрабатывать информацию, которую Вы получаете от запроса, как это:

$manufacturer=''; 
$actualRow=-1; 
while ($row = $result->fetch_assoc()) { 
    if($manufacturer!==$row['manufacturer']){ 
    $rows[] = array('manufacturer'=>$row['manufacturer'], 
        'founded'=>$row['founded'], 
         'car'=>array($row['car'])); 
    $actualRow++; 
    }else{ 
    $rows[$actualRow][car][]=$row['car']; 
    } 
} 

Надеется, что это помогает

Смежные вопросы