Я вытаскиваю список жанров из базы данных, и я пытаюсь сортировать их по наиболее распространенным событиям. Но когда я вытаскиваю их из базы данных, они все еще разделены:
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. Eg "Str1, Str2, Str3" $genres = explode(", ", $genres); echo "<pre>"; print_r($genres); echo "</pre>";
Я не получил больше, потому что я просто пытаюсь организовать все это в один массив.
Возможно, я не знаю, что делаю, потому что я все еще дерьмо, когда дело доходит до массивов, но, может быть, ветераны php найдут что-то.
Если вы измените структуру базы данных, вы сможете сделать запрос, который возвращает желаемые значения.
Но теперь вы можете сделать что-то подобное
$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"}
Я хотел бы рассмотреть возможность хранения ваших данных в лучшем формате. Нормализованная база данных будет выглядеть примерно так:
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
Эта модель более гибкая, чем хранение отдельного списка запятой. Например, он также делает процесс фильтрации альбомов по жанру простым и точным.