首页 > 解决方案 > 如何根据某些条件对多维数组求和?

问题描述

 $arr = [ [
        '5'=>[
            'BG' => 50,
            'CH' => 60,
            'LG' => 50,
            'MT' => 40,
            'MO' => 80,
            'PH' => 60,
            'GE' =>null
        ]
    ], [
        '6'=>[
            'BG' => 90,
            'CH' => 60,
            'LG' => 60,
            'MT' => 50,
            'MO' =>null,
            'PH' => 50,
            'GE' =>null
        ]
    ],[
        '7'=>[
            'BG' => 80,
            'CH' => 55,
            'LG' => 65,
            'MT' => 50,
            'MO' =>null,
            'PH' => 50,
            'GE' => 55
        ]
    ]
  ];

对于每个 id 5、6 和 7,我想总结分数。CH, PH, MO 和 LG 总是必须总结的。但是在总结了必修项目之后,我想根据以下条件总结其他项目。如果 MO 为空,则取 BG、MT 和 GE 中最好的两个。如果MO不为null或大于等于0,我想从BG、MT或GE中取最好的一个。

所以总结结果如下:

Array
(
  [5] => Array
    (
        [score] => 300
    )
[6] => Array
    (
        [score] => 310
    )
[7] => Array
    (
        [score] => 305
    )
)

我试过foreach了,但我无法解决问题。我该如何解决这个问题?

标签: phparrayssortingmultidimensional-arrayassociative-array

解决方案


这是实现此目的的更核心方法,请查找内联文档进行解释,

$keys  = array_flip(['BG', 'MT', 'GE']); // best of how many keys
$Ckeys = array_flip(['CH', 'PH', 'MO', 'LG']); // compulsory keys
foreach ($arr as $key => $value) {
    // use to pass parameters to reduce function during call
    $temp[key($value)] = array_reduce($value, function (&$result, $a) use ($keys, $Ckeys) {
        // if mo empty then best of two else best of one
        $bestHowMany = (!empty($a['MO']) ? 1 : 2);
        // fetching best of keys from $keys
        $t           = array_intersect_key($a, $keys);
        // reverse sort and maintains keys
        arsort($t);
        // fetch top $bestHowMany Values
        $largest2 = array_slice($t, 0, $bestHowMany);
        // fetch compulsory values from CKeys
        $t1       = array_intersect_key($a, $Ckeys);
        // sum by merging compulsory and best of $bestHowMany values
        return array_sum(array_merge($t1, $largest2));
    });
}

工作演示

输出

Array
(
    [5] => 300
    [6] => 310
    [7] => 305
)

推荐阅读