2015-02-04 3 views
0

Я собираю список жанров из базы данных, и я пытаюсь сортировать их по наиболее распространенным событиям. Но когда я достаю их из базы данных, они по-прежнему разделены:Объединить несколько массивов в один массив

Array 
(
    [0] => Blues Rock 
    [1] => Garage Rock 
    [2] => Hard Rock 
) 
Array 
(
    [0] => Garage Rock 
    [1] => Blues Rock 
    [2] => Hard Rock 
) 

Но я хочу, чтобы выйти в один массив, который может быть отсортированный тянуть верхние жанры. Он должен выглядеть Жанры: Garage Rock, Blues Rock, Hard Rock

Вот мой код:

$genreSql = "SELECT `genres` FROM `song_genres` WHERE `album_id` = '$album_id' AND `band_id` = '$band_id'"; 
$queryGenre = mysqli_query($conn, $genreSql) or die (mysqli_error($conn)); 
while ($rowG = mysqli_fetch_array($queryGenre)){ 

    $genres = $rowG['genres']; // Goes into the db as a string. E.g. "Str1, Str2, Str3" 
    $genres = explode(", ", $genres); 

    echo "<pre>"; 
    print_r($genres); 
    echo "</pre>"; 

я гаванью»получил дальше, потому что я просто пытаюсь организовать все это в один массив.

Возможно, я не знаю, что я делаю, потому что я все еще дерьмо, когда дело доходит до массивов, но, возможно, ветераны php найдут что-то.

+1

Осторожно с sqlinjection! – Keo

+0

показать нам вашу структуру таблицы, данные образца в таблице и таблицу ожидаемых результатов, пожалуйста, – Alex

+0

@KimAlexander Как это сделать? –

ответ

2

Если вы измените структуру базы данных, вы сможете сделать запрос, который возвращает желаемые значения.

Но теперь вы можете сделать что-то вроде этого

$array_of_array_of_genres[] = [ 
    'Blues Rock', 
    'Garage Rock', 
    'Hard Rock',]; 
$array_of_array_of_genres[] = [ 
    'Garage Rock', 
    'Blues Rock', 
    'Hard Rock']; 
$array_of_array_of_genres[] = [ 
    'POP', 
    'Hard Rock']; 
$all_genres = call_user_func_array('array_merge', $set_of_set_of_genres); 
// {"0":"Blues Rock","1":"Garage Rock","2":"Hard Rock","3":"Garage Rock","4":"Blues Rock","5":"Hard Rock","6":"POP","7":"Hard Rock"} 
$count_genres = array_count_values($all_genres); 
// {"Blues Rock":2,"Garage Rock":2,"Hard Rock":3,"POP":1} 
arsort($count_genres); 
// {"Hard Rock":3,"Garage Rock":2,"Blues Rock":2,"POP":1} 
$result = array_keys($count_genres); 
// {"0":"Hard Rock","1":"Garage Rock","2":"Blues Rock","3":"POP"}    
+0

Я положил '$ array_of_array_of_genres []' внутри цикла while, и я изменил 'call_user_func_array ...' на 'array_merge ($ array_of_array ...)'. Он сделал именно то, что я хочу, после того как я изменил таблицы в базе данных. –

2

Я бы рассмотреть хранение данных в лучшем формате. Нормализованная база данных будет выглядеть примерно так:

albums 
-id 
-name 

genres 
-id 
-name 

album_genre 
-album_id 
-genre_id 

album_genre проведет один (альбом) для многих (жанры) отношений:

album_id genre_id 
1   2 
1   3 
1   10 

Получение итогов тогда просто:

SELECT 
    b.id AS genre_id, b.name AS genre_name, COUNT(a.genre_id) as total 
FROM 
    album_genre a 
JOIN 
    genres b ON a.genre_id = b.id 
GROUP BY 
    a.genre_id 
ORDER BY 
    total DESC 

Эта модель более гибкая, чем хранение отдельного списка с запятой. Например, он также делает процесс фильтрации альбомов по жанру простым и точным.

+0

Я использовал код другого парня, но я переделал базу данных, чтобы вытащить жанры из совместной базы данных, поэтому я ценю этот совет. Огромное спасибо! –

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