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

按new_date合并两数组为第三数组,缺失值补0的实现咨询

解决方案:按new_date合并两个数组,缺失字段补0

嘿,我完全懂你遇到的困扰——想把两个分别带data和data1的数组合并,每个日期条目里必须同时有这两个字段,没有的就填0。之前试的array_merge和array_combine确实搞不定,这俩函数的设计本来就不是干这个活的。咱们可以用下面这个思路来实现你的需求:

核心思路

  1. 先把两个数组转换成以new_date为键的关联数组,这样后续查找对应日期的值会非常高效;
  2. 收集所有出现过的日期,确保不遗漏任何一方的条目;
  3. 按日期排序(和你期望的结果顺序一致);
  4. 遍历每个日期,组装包含new_date、data、data1的条目,缺失的字段直接设为0。

完整代码示例

// 你的原始数组(补全了语法闭合)
$array1 = [
    ["data" => 118, "new_date" => "06-2017"],
    ["data" => 263, "new_date" => "07-2017"],
    ["data" => 264, "new_date" => "08-2017"],
    ["data" => 266, "new_date" => "09-2017"],
    ["data" => 306, "new_date" => "10-2017"],
    ["data" => 100, "new_date" => "11-2017"],
];

$array2 = [
    ["data1" => 100, "new_date" => "02-2016"],
    ["data1" => 170, "new_date" => "06-2017"],
    ["data1" => 354, "new_date" => "07-2017"],
    ["data1" => 397, "new_date" => "08-2017"],
    ["data1" => 421, "new_date" => "09-2017"],
    ["data1" => 531, "new_date" => "10-2017"],
];

// 步骤1:将数组转为以new_date为键的关联数组
$array1Keyed = [];
foreach ($array1 as $item) {
    $array1Keyed[$item['new_date']] = $item['data'];
}

$array2Keyed = [];
foreach ($array2 as $item) {
    $array2Keyed[$item['new_date']] = $item['data1'];
}

// 步骤2:收集所有不重复的日期
$allDates = array_unique(array_merge(array_keys($array1Keyed), array_keys($array2Keyed)));

// 步骤3:按日期排序(保证结果按时间顺序排列)
usort($allDates, function($a, $b) {
    $dateA = DateTime::createFromFormat('m-Y', $a);
    $dateB = DateTime::createFromFormat('m-Y', $b);
    return $dateA <=> $dateB;
});

// 步骤4:组装最终的合并数组
$array3 = [];
foreach ($allDates as $date) {
    $array3[] = [
        "new_date" => $date,
        "data" => $array1Keyed[$date] ?? 0, // 空合并运算符,PHP7+可用
        "data1" => $array2Keyed[$date] ?? 0,
    ];
}

// 输出结果
print_r($array3);

代码说明

  • 用foreach把原始数组转成日期为键的数组,这样后续查找值只需要O(1)的时间,比循环遍历查找高效得多;
  • array_unique + array_merge确保我们拿到所有出现过的日期,不会漏掉任何一个条目;
  • usort配合DateTime实现日期的正确排序,保证结果和你期望的时间顺序一致;
  • 使用PHP7+的空合并运算符??,可以简洁地处理“存在就用值,不存在就设0”的逻辑,比isset判断更简洁。

为什么之前的函数不行?

  • array_merge只是简单地把两个数组的元素拼接在一起,不会根据new_date去匹配合并条目;
  • array_combine要求两个数组的长度完全相同,并且是用第一个数组的元素当键、第二个数组的元素当值,完全不符合我们按日期合并的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:43:39