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

如何用PHP生成符合需求的指定JSON格式?

问题:调整PHP代码生成目标JSON格式

需求说明

我想要生成这样的JSON结构,其中键1到7对应一周的每一天,每个键下是多个包含start和end时间段的数组:

{ 
  "1" : [{"start": "", "end": ""}], 
  "2" : [{"start": "", "end": ""}], 
  "3" : [{"start": "", "end": ""}], 
  "4" : [{"start": "", "end": ""}], 
  "5" : [{"start": "", "end": ""}], 
  "6" : [{"start": "", "end": ""}], 
  "7" : [{"start": "", "end": ""}] 
}

但目前用PHP生成的结果却是一个包含多个独立对象的数组,结构不符合预期:

[ 
  {"1" : [{"start": "", "end": ""}]}, 
  {"2" : [{"start": "", "end": ""}]}, 
  {"3" : [{"start": "", "end": ""}]}, 
  {"4" : [{"start": "", "end": ""}]}, 
  {"5" : [{"start": "", "end": ""}]}, 
  {"6" : [{"start": "", "end": ""}]}, 
  {"7" : [{"start": "", "end": ""}]}
]

每个时间段的格式是{"start": "12:00:00", "end": "14:00:00"},同一个星期几可能对应多个这样的时间段。

现有代码

//根据用户ID从数据库获取所有日期数据
$aDays = Schedule::getDays($nIdUser);
//存储数据的数组
$aJson = [];
//循环遍历
foreach ($aDays as $aInfoDay) {
    //根据日期ID获取单日时间段
    $aRangesHours = Schedule::getDayRanges("id_day = {$aInfoDay['id_day']} AND id_user = {$nIdUser}");
    $aParsedDay = [];
    //遍历时间段
    foreach ($aRangesHours as $aRangeHour) {
        $aParsedDay[$aRangeHour['id_day']][] = array('start' => $aRangeHour['startHour'],'end' => $aRangeHour['endHour']);
    }
    //将数据存入aJson数组
    $aJson[] = $aParsedDay;
}

解决方案

问题出在两个地方:一是你把每个日期的时间段包装成独立对象后追加到数组里,二是用id_day作为键而不是星期几的标识(1-7)。调整步骤如下:

  1. 获取星期几的标识:首先确认$aInfoDay里有对应星期几的字段(比如weekday,值为1到7);如果没有,就从日期字段计算(比如用date('N', strtotime($aInfoDay['date_column']))获取ISO星期几,1=周一,7=周日)。
  2. 直接构建关联数组:不要把每个日期的对象追加到$aJson,而是直接把时间段数组赋值给$aJson对应星期几的键。如果同一个星期几有多个日期的时间段,自动合并数组。

修改后的代码示例:

//根据用户ID从数据库获取所有日期数据
$aDays = Schedule::getDays($nIdUser);
//存储数据的关联数组,键为1-7
$aJson = [];
//初始化所有星期几的默认空数组(确保每个键都存在,可选)
for ($i = 1; $i <=7; $i++) {
    $aJson[$i] = [];
}
//循环遍历
foreach ($aDays as $aInfoDay) {
    // 获取当前日期对应的星期几,这里假设$aInfoDay有weekday字段
    // 无此字段则用日期计算:$weekday = date('N', strtotime($aInfoDay['date_column']));
    $weekday = $aInfoDay['weekday'];
    
    //根据日期ID获取单日时间段
    $aRangesHours = Schedule::getDayRanges("id_day = {$aInfoDay['id_day']} AND id_user = {$nIdUser}");
    
    //遍历时间段,添加到对应星期几的数组中
    foreach ($aRangesHours as $aRangeHour) {
        $aJson[$weekday][] = [
            'start' => $aRangeHour['startHour'],
            'end' => $aRangeHour['endHour']
        ];
    }
}

//生成目标JSON
$jsonResult = json_encode($aJson, JSON_PRETTY_PRINT);

关键调整点

  • 去掉了中间的$aParsedDay数组,直接把时间段添加到$aJson的对应星期几键下,减少不必要的中间变量。
  • 用星期几数字(1-7)作为$aJson的键,替换原来的id_day,确保对应到目标JSON的结构。
  • 可选的初始化循环确保即使某天没有时间段,JSON里依然保留对应的键和空数组,完全匹配你想要的格式。
  • 放弃了$aJson[] = ...的数组追加方式,这种方式会生成包含多个独立对象的数组;改用关联数组赋值,转JSON后就是单一的目标对象结构。

内容的提问来源于stack exchange,提问作者Emmanuel Fernandez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:22:59