You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP MySQL:如何整理含键值的数组查询结果并去重

解决MySQL键值对表数据合并重复问题

我来帮你搞定这个问题!你的核心问题在于数组构建逻辑错误加上SQL的GROUP BY使用不当,导致同一个用户的记录被拆分成多条不完整的结果输出。下面一步步帮你修正:

问题分析

  1. 错误的GROUP BY:你的mohamiusermeta表是典型的键值对结构(一行存储一个用户的一个属性),使用GROUP BY user_id会让数据库只返回每个用户的第一条匹配记录,这完全不符合你需要获取用户所有属性的需求,必须去掉这个GROUP BY。
  2. 数组逻辑漏洞:原代码每次循环都会新建一个subArray,并把当前累加的$output字段塞进去,导致同一个用户的记录被多次输出,每次只新增一个字段,最终出现重复的user_id。

修正后的完整代码

// 去掉错误的GROUP BY,获取所有用户的匹配属性记录
$sql = mysqli_query($con, "select user_id, meta_key, meta_value FROM mohamiusermeta where meta_key IN ('websiteurl', 'profile_photo', 'Office', 'address_user', 'agentarea', 'offertext' , 'officename', 'cover_photo', 'membertype')");

$userData = array();

while($row = mysqli_fetch_assoc($sql)) {
    $userId = $row['user_id'];
    
    // 初始化用户基础结构(如果该用户还未被处理)
    if (!isset($userData[$userId])) {
        $userData[$userId] = array(
            'user_id' => $userId
        );
    }
    
    // 将当前属性追加到对应用户的数组中
    $userData[$userId][$row['meta_key']] = $row['meta_value'];
}

// 将以user_id为键的关联数组转为索引数组(符合你期望的输出格式)
$newarray = array_values($userData);

// 输出JSON,保留中文不转义
echo json_encode($newarray, JSON_UNESCAPED_UNICODE);

// 修复原代码的遗漏:传入数据库连接参数
mysqli_close($con);

额外优化(可选)

如果希望所有字段都存在(哪怕为空值),避免某些用户缺少属性导致字段缺失,可以在初始化用户数组时预设所有字段:

if (!isset($userData[$userId])) {
    $userData[$userId] = array(
        'user_id' => $userId,
        'Office' => '',
        'officename' => '',
        'address_user' => '',
        'profile_photo' => '',
        'cover_photo' => '',
        'agentarea' => '',
        'offertext' => '',
        'websiteurl' => '',
        'membertype' => ''
    );
}

这样输出的JSON结构会完全统一,每个用户对象都包含所有需要的字段。

内容的提问来源于stack exchange,提问作者Mr.Balaha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:35:53