Php Array Zipper - добавьте два массива по значению ключа - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь сделать это максимально эффективно.

У меня есть несколько массивов:

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_map, array_walk или чем-то еще.У кого-нибудь есть идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Я считаю, что вам нужно использовать какой-то 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);

https://3v4l.org/WHdDJi

0 голосов
/ 26 ноября 2018

Вот один foreach.Но тройной тройной 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;
  }
}
...