PHP JSON数组首行有值却返回空值及重复值问题排查
问题分析与修复方案
嘿,我帮你揪出代码里的问题啦!你的代码主要有两个核心逻辑漏洞,直接导致了首行空值和重复条目的问题:
1. 没按user_id分组,重复生成条目
你的SQL查询会返回每个用户的多条记录(每个meta_key单独占一行),但你在while循环里每读一行就把$subArray塞进$newarray,这就意味着同一个用户会被添加N次(N等于该用户的meta_key数量),自然就出现了大量重复值。
2. $output数组没按用户重置,字段值混乱
$output是全局变量,切换用户的时候没有清空。比如处理第一个用户的第一条记录时,$output里只有当前这条的meta_key值,其他字段还没被赋值就被塞进数组了,所以首行才会出现空值;而处理下一个用户时,$output还留着上一个用户的所有数据,会导致字段值串味。
修复后的代码
<?php $sql = mysqli_query($con, "SELECT * FROM mohamiusermeta WHERE meta_key IN ('websiteurl', 'profile_photo', 'Office', 'address_user', 'agentarea', 'offertext', 'officename', 'cover_photo', 'membertype') ORDER BY user_id DESC"); // 先按user_id分组,把同一个用户的所有字段攒到一起 $userData = []; while ($row = mysqli_fetch_assoc($sql)) { $userId = $row['user_id']; // 第一次处理这个用户时,先初始化一个包含user_id的数组 if (!isset($userData[$userId])) { $userData[$userId] = ['user_id' => $userId]; } // 把当前的键值对直接存入用户专属数组 $userData[$userId][$row['meta_key']] = $row['meta_value']; } // 把关联数组转成索引数组,和你原代码的输出格式保持一致 $newarray = array_values($userData); // 输出JSON,记得转码 echo json_encode($newarray, JSON_UNESCAPED_UNICODE); mysqli_close($con); ?>
为啥这样改就对了?
- 按用户分组存储:用
$userData以user_id为键,把同一个用户的所有meta_key值都聚合到同一个数组里,每个用户只会生成一条数据,彻底解决重复问题。 - 动态赋值字段:不用手动挨个写
$subArray[Office]这种固定字段了,直接用数据库里的meta_key当键,既灵活又不容易写错字段名。 - 初始化用户数组:第一次处理某个用户时先创建基础数组,确保
user_id肯定存在,不会出现空值。 - 优化SQL语句:把一堆
OR改成IN,语句更简洁,可读性也更高。
这样调整后,每个用户只会在结果里出现一次,所有字段都会正确填充对应的值,空值和重复的问题就都解决啦~
内容的提问来源于stack exchange,提问作者Mr.Balaha
相关产品推荐
相关产品推荐

