【问题标题】:Merge multiple arrays into one array将多个数组合并为一个数组
【发布时间】:2015-02-04 01:46:50
【问题描述】:

我正在从数据库中提取流派列表,并尝试按最常见的情况对它们进行排序。但是当我从数据库中提取它们时,它们仍然是分开的:

Array
(
    [0] => Blues Rock
    [1] => Garage Rock
    [2] => Hard Rock
)
Array
(
    [0] => Garage Rock
    [1] => Blues Rock
    [2] => 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 的老手会找到一些东西。

【问题讨论】:

  • 小心使用sqlinjection!
  • 请向我们展示您的表结构、表中的示例数据以及预期结果表
  • @KimAlexander 我该怎么做?
  • 您需要了解数据库规范化。不要将值存储在以逗号分隔的单个列中!使用附加关系表创建多对多关系,您可以使用简单的 SQL 查询来解决此问题。这就是 RDBMS 的用途!
  • 复制-粘贴-编辑-保存-发布

标签: php mysql arrays


【解决方案1】:

如果您更改数据库结构,您将能够进行返回所需值的查询。

但是现在你可以做这样的事情

$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"}            

【讨论】:

  • 我将$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

此模型比存储逗号分隔列表更灵活。例如,它还使按流派过滤专辑的过程变得简单而精确。

【讨论】:

  • 我使用了其他人的代码,但我确实修改了数据库以从联合数据库中提取流派,所以我很欣赏这个建议。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2015-11-11
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 2020-08-21
  • 2015-09-28
相关资源
最近更新 更多