【问题标题】:How do i merge specific parts of an associative array?如何合并关联数组的特定部分?
【发布时间】:2016-05-03 16:30:25
【问题描述】:

先提问,后解释:

第一个数组的原样,我想要一个看起来像第二个数组的:

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

因此,对于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,我认为有一个查询可以立即让我获得第二个数组(我想要的那个)。

到目前为止我的解决方案: 我实际上使用 php arglorithm 解决了这个问题,但是如果任何扩展或者我添加新列,它有点复杂和困难:

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']));
    }

}

【问题讨论】:

    标签: php mysql arrays mysqli


    【解决方案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))
    

    只返回不同的值。

    【讨论】:

    • 这很好用,但是数组键名为 group_concat(genres.genre_name),有什么好的方法来改变它? 编辑: 只需添加 AS new_name
    猜你喜欢
    • 2012-12-19
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2016-09-28
    • 2015-09-23
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多