Php数组拉链-按键值添加两个数组

Php数组拉链-按键值添加两个数组,php,arrays,loops,array-map,array-walk,Php,Arrays,Loops,Array Map,Array Walk,我正在尽可能有效地做这件事 我有多个阵列: array1 = [ "2018" => [ "JAN" => 100, "FEB" => 200, "MAR" => 300, "APR" => 400 ] ] array2 = [ "2018" => [ "FEB" => 200, "MAR" => 300,

我正在尽可能有效地做这件事

我有多个阵列:

array1 = [
 "2018" => 
    [
        "JAN" => 100,
        "FEB" => 200,
        "MAR" => 300,
        "APR" => 400
    ]
]

array2 = [
 "2018" => 
    [
        "FEB" => 200,
        "MAR" => 300,
        "APR" => 400,
        "MAY" => 200,
    ]
]

array3 = [
 "2018" => 
    [
        "MAY" => 200,
        "JUN" => 100,
        "JUL" => 300,
        "AUG" => 400,
    ]
]
我想将这些阵列与年/月总数的期望输出相加:

sumArray = [
     "2018" => 
        [
            "JAN" => 100,
            "FEB" => 400,
            "MAR" => 600,
            "APR" => 800
            "MAY" => 400,
            "JUN" => 100,
            "JUL" => 300,
            "AUG" => 400,
        ]
    ]
我想避免多个foreach循环,并认为使用array\u map、array\u walk或其他方法会有更好的解决方案。有人有主意吗


谢谢

这是一张单人票。但三元ifs:

$monthCodes = array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC");
foreach($monthCodes as $key => $monthCode){
  $add = 0;
  $add += ( isset($array1["2018"][$monthCode]) ) ?  $array1["2018"][$monthCode] : 0;
  $add += ( isset($array2["2018"][$monthCode]) ) ?  $array2["2018"][$monthCode] : 0;
  $add += ( isset($array3["2018"][$monthCode]) ) ?  $array3["2018"][$monthCode] : 0;
  if($add <> 0){
    $sumArray["2018"][$monthCode] = $add;
  }
}
$monthCodes=数组(“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”);
foreach($monthCode作为$key=>$monthCode){
$add=0;
$add+=(isset($array1[“2018”][$monthCode])?$array1[“2018”][$monthCode]:0;
$add+=(isset($array2[“2018”][$monthCode])?$array2[“2018”][$monthCode]:0;
$add+=(isset($array3[“2018”][$monthCode])?$array3[“2018”][$monthCode]:0;
如果($add 0){
$sumArray[“2018”][$monthCode]=$add;
}
}

我认为您需要使用某种形式的foreach来有效地执行此操作

我创建了一个包含所有数组的新数组,并循环它的子数组来求和

// Add arrays that needs to be summed in the line below
$new = array_merge_recursive([$array1], [$array2], [$array3]);
foreach($new as $arr){
    foreach($arr as $year => $sub){
        foreach($sub as $month => $val){
            if(!isset($res[$year][$month])) $res[$year][$month] =0;
            $res[$year][$month] += $val;
        }
    }
}
var_dump($res);

使用
foreach(){}
有什么问题?另外,为什么有
array1
array2
array3
?这些应该是父数组的子数组,您应该能够非常轻松地进行循环。此外,您的变量声明缺少美元符号。你的问题包含了大量的胡说八道,诚实地说,没有任何努力;这是随机的家庭作业吗?你应该发布你到目前为止尝试过的内容。不确定tern更好的解决方案,只要你不重复使用暴力
foreach()
,这是更快的解决方案。查看此链接:OP看起来很新,所以我认为用晦涩的
代替更为人熟知的
,是不明智的=。但是你也可以用0得到几个月的时间-我不确定这是否是require输出的一部分。这段代码很完美,正是我想要的。非常感谢您花时间专业地回答我的问题,感谢您有经验了解我在做什么和寻找什么。@DavidWinder这是生成正确计数的动态代码的唯一方法。