我试图从数据库中提取一系列类型。我在每个歌曲的数据库中输入一个流派列表,然后它(应该)将每首歌曲的类型拉入一个列表中,并按照前三个最常见的顺序排列。
这种类型以这种方式被放入一个文本字段:
(基本时尚,不是实际结果):
blues rock, garage rock, hard rock
这是我的代码:
$sql = "SELECT `song_name`, `song_genres` FROM `songs` WHERE `album_id` = '$songAlbumId'";
$query = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_array($query)){
$song_name = $row['song_name'];
$song_genres = explode(", ", $row['song_genres']);
for ($i = 0; $i < count($song_genres); $i++){
$count=array_count_values($song_genres);//Counts the values in the array, returns associatve array
arsort($count);//Sort it from highest to lowest
$keys=array_keys($count);//Split the array so we can find the most occuring key
echo $keys[$i] . "<br>";
}
}
这最终给了我:
Hard Rock
Garage Rock
Hard Rock
Garage Rock
Psychedelic Rock
Blues Rock
Garage Rock
Hard Rock
另请注意,相册ID或其他内容没有任何问题。它特别适用于正确订购的流派。
答案 0 :(得分:1)
规范化类型。使用genres
表而不是以逗号分隔的列表,以及另外的songs_genres
表来将歌曲链接到流派。然后你可以从数据库中获取数据而无需php中的其他逻辑
SELECT g.name, COUNT(DISTINCT(sg.song_id)) cnt
FROM genres g
INNER JOIN songs_genres sg ON sg.genre_id = g.id
GROUP BY g.name
ORDER BY cnt DESC
LIMIT 3
答案 1 :(得分:0)
您需要另一个循环,以便您的流派为每个歌曲名称回显
while ($row = mysqli_fetch_array($query)){
$song_name = $row['song_name'];
$song_genres = explode(", ", $row['song_genres']);
foreach($song_name as $songname){
for ($i = 0; $i < count($song_genres); $i++){
$count=array_count_values($song_genres);//Counts the values in the array, returns associatve array
arsort($count);//Sort it from highest to lowest
$keys=array_keys($count);//Split the array so we can find the most occuring key
echo $keys[$i] . "<br>";
}
}
}
答案 2 :(得分:0)
我花了几天时间试图解决这个问题。我最终重新编写了数据库并将歌曲类型发布到歌曲,专辑和乐队部分的数据库中,以便轻松实现。
对于将来需要帮助解决此类问题的任何人,解决方案就在这里:Merge multiple arrays into one array。
我很欣赏其他人的意见。