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
相关产品推荐
相关产品推荐

