合并相似的数组,PHP或MySQL

4

我有一个基于查询结果的数组:

array(5) {
  [1] => array(5) {
    ["user_id"] => int(659)
    ["auth_id"] => string(28) "uhhuhhoney"
    ["username"] => string(10) "MarkH"
    ["avatar_date"] => int(1374525025)
    ["gravatar"] => string(0) ""
  }
  [2] => array(5) {
    ["user_id"] => int(326)
    ["auth_id"] => string(9) "rabits"
    ["username"] => string(9) "HankHill"
    ["avatar_date"] => int(1398866942)
    ["gravatar"] => string(0) ""
  }
  [3] => array(5) {
    ["user_id"] => int(326)
    ["auth_id"] => string(28) "identity_iml"
    ["username"] => string(9) "HankHill"
    ["avatar_date"] => int(1398866942)
    ["gravatar"] => string(0) ""
  }
  [4] => array(5) {
    ["user_id"] => int(1)
    ["auth_id"] => string(28) "barney"
    ["username"] => string(12) "Alice"
    ["avatar_date"] => int(1407362848)
    ["gravatar"] => string(0) ""
  }
  [5] => array(5) {
    ["user_id"] => int(1)
    ["auth_id"] => string(28) "a65s564sfad56654fsad"
    ["username"] => string(12) "Alice"
    ["avatar_date"] => int(1407362848)
    ["gravatar"] => string(0) ""
  }
}

我希望能够合并任何具有相同user_id的条目,这将合并数组键“auth_id”。现在我有点困惑,不知道是否可以通过MySQL或PHP实现。
我尝试使用GROUP_CONCAT函数通过MySQL来合并相似内容,但它只能将每个auth_id合并到单个行中。
查询如下:
SELECT mumble.*, user.username, user.avatar_date, user.gravatar,
GROUP_CONCAT(mumble.auth_id)
FROM xf_mumble AS mumble
LEFT JOIN xf_user AS user ON (user.user_id = mumble.user_id)
ORDER BY mumble.user_id DESC, user.username

如果无法通过MySQL实现,那么我该如何通过PHP有效地实现呢?因为我想不到一个好的方法来做这件事。我正在考虑以下方案:
$results = array();

for (new $i = 0, $i < sizeof($query), $i++)
{
    if (array_key_exists($query[$i - 1]) && $query[$i - 1]['user_id'] = $query[$i]['user_id'])
    {
        $results[$i]['auth_id'][] = $query[$i]['auth_id'];
    }
}

谢谢!

2个回答

3
您的查询需要使用group by
SELECT mumble.*, user.username, user.avatar_date, user.gravatar,
       GROUP_CONCAT(mumble.auth_id)
FROM xf_mumble AS mumble LEFT JOIN
     xf_user AS user
     ON (user.user_id = mumble.user_id)
GROUP BY mumble.user_id, user.username
ORDER BY mumble.user_id DESC, user.username

然后(这可能很明显,但为了清楚起见),使用 explode,例如 explode(',', $query[$i]['auth_id']) - Matt Browne
“group by” 的作用是什么,它是如何解决这个问题的? - Rhododendron
@EllisonPatterson . . . 您正在使用聚合函数 group_concat()。如果没有 group by,MySQL 将返回恰好一行 -- 所有匹配行的串联。您似乎想要每个 user_id 一行,这就是为什么需要 group by - Gordon Linoff

0
你想要这样的吗?query 是你要展示的数组。
$results = array();
foreach ($query as $result) {
    $results[$result['user_id']][] = $result['auth_id'];
}

结果将是:

array (3) {
    [659] => array(1) {
        [0] => string(10) "uhhuhhoney"
    }
    [326] => array(2) {
        [0] => string(6) "rabits"
        [1] => string(12) "identity_iml"
    }
   [1] => array(2) {
       [0] => string(6) "barney"
       [1] => string(20) "a65s564sfad56654fsad"
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接