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

PHP一维数组与多维数组对比及缺失日期补全需求

解决PHP一维数组与多维数组的日期补全问题

嘿,我来帮你搞定这个问题!你的需求是用一维数组A的完整日期列表,对比多维数组B里的日期,把A中B缺失的日期位置补上date键和counter => 0的条目对吧?咱们一步步来实现:

第一步:先从多维数组B中提取日期映射

首先得把B里的日期和对应的完整条目做个映射,这样后续检查和取值都会非常高效。毕竟你的B结构是嵌套的(B[n]['logins'][m]['date']),直接遍历查找太麻烦:

// 构建B的日期到完整条目的映射数组
$bDateMap = [];
foreach ($B as $item) {
    // 遍历每个元素下的logins数组
    foreach ($item['logins'] as $loginRecord) {
        // 用日期作为键,存储对应的完整记录
        $bDateMap[$loginRecord['date']] = $loginRecord;
    }
}

第二步:遍历A的日期,补全缺失条目

接下来我们按照一维数组A的日期顺序,逐个检查每个日期是否在刚才的映射里。存在的话就保留B里的原条目,缺失的就生成带counter => 0的新数组:

$completedResult = [];
foreach ($A as $targetDate) {
    if (isset($bDateMap[$targetDate])) {
        // 日期存在,直接把B里的对应记录加进去
        $completedResult[] = $bDateMap[$targetDate];
    } else {
        // 日期缺失,生成符合要求的补全条目
        $completedResult[] = [
            'date' => $targetDate,
            'counter' => 0
        ];
    }
}

测试示例效果

用你给出的示例数据测试:

$A = [ 
    0 => "2018-03", 
    1 => "2018-02", 
    2 => "2018-01", 
    3 => "2017-12", 
    4 => "2017-11", 
    5 => "2017-10" 
]; 
$B = [ 
    0 => [ 
        'logins' => [ 
            0 => [ 
                "date" => "2018-03",
                'counter' => 5 // 假设原记录有这个字段
            ] 
        ] 
    ] 
];

运行代码后,$completedResult的最终结果会是:

[
    ['date' => '2018-03', 'counter' => 5],
    ['date' => '2018-02', 'counter' => 0],
    ['date' => '2018-01', 'counter' => 0],
    ['date' => '2017-12', 'counter' => 0],
    ['date' => '2017-11', 'counter' => 0],
    ['date' => '2017-10', 'counter' => 0],
]

这样就完美实现了需求:既保留了B中已有的有效数据,又按照A的日期顺序补全了所有缺失的条目,每个缺失条目都带有要求的date和counter => 0键值对。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:32:25