2016-01-26 2 views
1

Вопрос первый, объяснение позже:Как объединить определенные части ассоциативного массива?

Insteat первого массива, я хочу один, который выглядит как secound массива:

echo json_encode($movies); 
//WHAT I DO NOT WANT: [{"movie_name":"test1","genre_name":"Action"},{"movie_name":"test2","genre_name":"Drama"},{"movie_name":"test2","genre_name":"Action"}] 
//WHAT I WANT: [{"movie_name":"test1","genres":["Action"]},{"movie_name":"test2","genres":["Drama","Action"]}] 

Так insteat из severals строк с одинаковым значением для MOVIE_NAME, но разные значения для genre_name, мне нужна одна строка для каждого фильма, где все genre_names объединены в один массив gernes;

Решение, которое я хочу: Данные извлекаются из базы данных с использованием php и mysqli. Это запрос SQL я использую и который генерирует первый массив:

SELECT movies.movie_name, genres.genre_name FROM genres 
INNER JOIN genre_movie ON genres.id = genre_movie.genre_id 
INNER JOIN movies ON movies.id = genre_movie.movie_id; 

Я не очень хорошо с SQL и думаю, что есть запрос который получает мне secound массив (тот, я хочу) сразу.

Мое решение до сих пор: я на самом деле решить эту проблему с помощью PHP arglorithm, но его любопытное complecated и твердые если что-нибудь чешуи или добавить новые столбцы:

foreach($myArray as $movie) 
{ 
    foreach($newList as $key => $item) 
    { 
     if($item['movie_name'] == $movie['movie_name']){ 
      $exists = true; 
      $position = $key; 
     } 
    } 
    if($exists == true) 
    { 
     $newList[$position]['genres'][] = $movie['genre_name']; 
     $exists= false; 

    } else { 
     $newList[] = array('movie_name' => $movie['movie_name'], 'genres' => array($movie['genre_name'])); 
    } 

} 

ответ

1

Взгляните на GROUP_CONCAT: http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat

Я не эмулировать ваши таблицы, но может быть, это ваш запрос:

SELECT movies.movie_name, group_concat(genres.genre_name) FROM genres 
INNER JOIN genre_movie ON genres.id = genre_movie.genre_id 
INNER JOIN movies ON movies.id = genre_movie.movie_id 
GROUP BY movies.movie_name; 

Издание

Ну, я подражал ему сейчас, и да, это ваш запрос. Я бы просто изменить:

group_concat(genres.genre_name) 

Для:

group_concat(distinct(genres.genre_name)) 

Для возврата только различные значения.

+0

Это отлично работает, но ключ массива называется group_concat (genres.genre_name), что это хороший способ изменить это? ** EDIT: ** просто нужно было добавить AS new_name – user1911283