
本文介绍如何根据指定的12个月时间范围(如最近7个月),自动向药品分发数组中插入 quantity: 0 的占位对象,确保 dispatch 数组严格按时间顺序包含所有目标月份,并保持结构完整、可预测。
本文介绍如何根据指定的12个月时间范围(如最近7个月),自动向药品分发数组中插入 `quantity: 0` 的占位对象,确保 `dispatch` 数组严格按时间顺序包含所有目标月份,并保持结构完整、可预测。
在医药数据报表或库存调度系统中,常需按连续月份展示药品分发量。若某月无实际发货记录,则 dispatch 数组中会缺失该月对象,导致前端图表断点、统计偏差或渲染异常。正确做法不是简单追加,而是按标准时间序列对齐补零——即:以权威月份列表(如 months)为基准,遍历每个目标周期,检查其是否已存在于 dispatch 中;若不存在,则生成对应结构的对象并插入,最终按 period 字符串升序排序,保证时间线连续且有序。
✅ 实现逻辑要点
- 基准优先:以 months 数组为准(含 period, year, position 等元信息),而非依赖 dispatch 的原始顺序;
- 精确匹配:使用 period 字段(如 "2022-5")作为唯一键比对,避免 month/year 组合可能引发的跨年歧义;
- 结构一致性:新插入对象必须与原有 dispatch 条目字段一致(month, year, quantity, period),其中 month 需从 period 解析(如 "2022-5" → 5);
- 稳定排序:插入后调用 usort() 按 period 升序重排,确保 "2021-12" 在 "2022-1" 之前,符合自然时间逻辑。
? PHP 示例代码(兼容 PHP 8.0+)
// 假设 $data 是原始响应 JSON 解码后的对象
// $monthsData 是包含最近7个月信息的 JSON 对象
foreach ($monthsData->months as $targetMonth) {
foreach ($data->records as &$record) {
// 查找 dispatch 中是否存在相同 period 的条目
$exists = array_filter($record->dispatch, fn($d) => $d->period === $targetMonth->period);
if (empty($exists)) {
// 解析 month 数字(注意:date('m') 会补零,需 (int) 转为整型)
$parsedMonth = (int) date('n', strtotime($targetMonth->period));
// 构造新条目并追加
$record->dispatch[] = (object)[
'month' => $parsedMonth,
'year' => $targetMonth->year,
'quantity'=> 0,
'period' => $targetMonth->period
];
}
}
unset($record); // 解除引用,避免意外修改
}
// 对每个 record 的 dispatch 按 period 升序排序(字符串比较即可,格式统一为 YYYY-M)
foreach ($data->records as &$record) {
usort($record->dispatch, fn($a, $b) => $a->period $b->period);
}
⚠️ 注意事项
- 时区安全:strtotime() 默认使用服务器时区。若数据跨时区,建议显式设置 date_default_timezone_set('UTC') 或改用 DateTimeImmutable 解析;
-
性能优化:当 dispatch 数据量大时,array_filter() 效率较低。可预先将现有 period 构建为 HashSet(PHP 中用关联数组模拟):
$existingPeriods = array_column($record->dispatch, 'period'); $existingSet = array_flip($existingPeriods); if (!isset($existingSet[$targetMonth->period])) { /* 插入 */ } - 不可变处理:若需保持原始数据纯净,应先 clone 或 json_encode/json_decode 深拷贝后再操作;
- 字段健壮性:生产环境建议增加 isset() 和类型校验,例如 isset($targetMonth->period) 和 is_string($targetMonth->period)。
通过该方案,你不仅能精准补全缺失月份,还能确保输出结构完全符合业务预期——无论是用于 ECharts 图表渲染,还是 Excel 导出、API 响应标准化,都具备强一致性与可维护性。











