
本文介绍如何根据指定的最近7个月时间序列,自动向患者发药记录的 dispatch 数组中插入缺失月份的占位对象(quantity: 0),并按时间升序排序,确保数据完整且时序正确。
本文介绍如何根据指定的最近7个月时间序列,自动向患者发药记录的 `dispatch` 数组中插入缺失月份的占位对象(`quantity: 0`),并按时间升序排序,确保数据完整且时序正确。
在医疗或药品分发系统中,常需按连续时间维度(如最近7个月)展示患者用药量统计。但原始数据中 dispatch 数组往往只包含实际有发货记录的月份,导致时间序列不连续,影响图表渲染或聚合计算。本教程提供一种健壮、可复用的 PHP 解决方案,实现:自动识别缺失月份 → 插入标准化占位项 → 按 period 升序重排。
核心逻辑说明
- 匹配依据:以 period 字符串(如 "2022-5")为唯一键,对比 months 列表与 dispatch 中现有项;
- 补全规则:对 months 中每个元素,若其 period 在 dispatch 中不存在,则生成新对象,其中 month 从 period 解析(避免硬编码月份映射),year 直接取自 months,quantity 固定为 0;
- 排序保障:每次插入后立即调用 usort() 按 period 字典序升序排列("2021-12"
完整实现代码(PHP)
// 假设 $data 是原始响应 JSON 解码后的对象(含 records 数组)
// $monthsData 是包含最近7个月信息的 JSON 解码对象(含 months 数组)
foreach ($monthsData->months as $targetMonth) {
foreach ($data->records as $record) {
// 检查当前 record.dispatch 是否已存在该 period
$exists = array_filter($record->dispatch, function($item) use ($targetMonth) {
return $item->period === $targetMonth->period;
});
if (empty($exists)) {
// 解析 period 获取 month 数字(如 "2022-5" → 5)
$parsedDate = DateTime::createFromFormat('Y-m', $targetMonth->period);
$monthNum = $parsedDate ? (int)$parsedDate->format('m') : (int)explode('-', $targetMonth->period)[1];
// 构造新 dispatch 项
$newDispatchItem = (object)[
'month' => $monthNum,
'year' => $targetMonth->year,
'quantity'=> 0,
'period' => $targetMonth->period
];
$record->dispatch[] = $newDispatchItem;
// 按 period 升序重排(关键!保证时间连续性)
usort($record->dispatch, function($a, $b) {
return strcmp($a->period, $b->period);
});
}
}
}
注意事项与最佳实践
- ✅ 日期解析健壮性:使用 DateTime::createFromFormat() 解析 period,比 date('m', strtotime()) 更可靠(避免 strtotime 对边界值如 "2021-13" 的误判);
- ✅ 性能优化:若 dispatch 数量较大,可预先将现有 period 提取为关联数组($existingPeriods = array_column($record->dispatch, 'period');),用 in_array() 替代 array_filter(),降低时间复杂度;
- ⚠️ 数据一致性:确保 months 数组本身按时间倒序(如示例中从6月→12月)或正序排列,否则插入位置可能不符合预期——但因最终强制 usort,不影响最终结果;
- ? 批量处理支持:代码天然支持多患者(records 多条),无需额外循环嵌套;
- ? 扩展性提示:如需兼容其他格式(如 "YYYY/MM"),仅需修改 period 解析逻辑和比较条件即可。
通过此方案,您可确保每个患者的 dispatch 数组始终精确包含目标时间段内全部月份,缺失项以 quantity: 0 显式表达,为前端可视化、同比环比分析及导出报表提供坚实的数据基础。











