PHP MySQL:如何整理含键值的数组查询结果并去重
解决MySQL键值对表数据合并重复问题
我来帮你搞定这个问题!你的核心问题在于数组构建逻辑错误加上SQL的GROUP BY使用不当,导致同一个用户的记录被拆分成多条不完整的结果输出。下面一步步帮你修正:
问题分析
- 错误的GROUP BY:你的
mohamiusermeta表是典型的键值对结构(一行存储一个用户的一个属性),使用GROUP BY user_id会让数据库只返回每个用户的第一条匹配记录,这完全不符合你需要获取用户所有属性的需求,必须去掉这个GROUP BY。 - 数组逻辑漏洞:原代码每次循环都会新建一个
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
相关产品推荐
相关产品推荐

