如何用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)。调整步骤如下:
- 获取星期几的标识:首先确认
$aInfoDay里有对应星期几的字段(比如weekday,值为1到7);如果没有,就从日期字段计算(比如用date('N', strtotime($aInfoDay['date_column']))获取ISO星期几,1=周一,7=周日)。 - 直接构建关联数组:不要把每个日期的对象追加到
$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
相关产品推荐
相关产品推荐

