本文详解如何在 php 中按日期等共享键列合并两个二维数组,自动补全缺失项并用默认值(如 0)填充空缺字段,适用于报表对齐、数据对比等场景。
在实际开发中,我们常需将两组结构相似但时间范围或记录不完全重叠的二维数组(如“当日新增工单”和“当日关闭工单”)按公共键(如日期)对齐合并,生成一份完整的时间序列汇总表。此时不仅需要匹配共有的键,还必须为某一数组中缺失的键提供默认值(如 0),确保结果数组覆盖全部时间点且结构统一。
以下是一个高效、简洁且可扩展的解决方案,无需嵌套循环,避免了原始代码中仅遍历 $openTicket 导致 $closeTicket 独有日期丢失的问题:
// 示例数据(注意变量名修正:$closedTicket 而非 $closeTicket,提升可读性) $openTicket = [ ['2025-01-19', 6], ['2025-01-20', 1], ['2025-01-21', 1], ['2025-01-22', 2], ]; $closedTicket = [ ['2025-01-17', 6], ['2025-01-18', 1], ['2025-01-21', 1], ['2025-01-23', 2], ]; // 步骤 1:获取全部唯一日期 $dates = array_unique(array_merge( array_column($openTicket, 0), array_column($closedTicket, 0) )); sort($dates); // 可选:按时间升序排列结果 // 步骤 2:构建以日期为键的快速查找表 $openByDate = array_column($openTicket, 1, 0); // ['2025-01-19' => 6, ...] $closedByDate = array_column($closedTicket, 1, 0); // ['2025-01-17' => 6, ...] // 步骤 3:生成最终对齐数组 $finalArray = []; foreach ($dates as $date) { $finalArray[] = [ $date, $openByDate[$date] ?? 0, // 缺失则为 0 $closedByDate[$date] ?? 0 // 缺失则为 0 ]; } print_r($finalArray);
通过此方法,你不仅能精准实现“左+右外连接”式合并,还能保持代码简洁、健壮且易于维护,是 PHP 数组数据对齐任务的标准实践。