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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:30:21