Как суммировать многомерные массивы на основе некоторых условий? - PullRequest
2 голосов
/ 02 июня 2019
 $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
        ]
    ]
  ];

Для каждого идентификатора № 5, 6 и 7 я хочу подвести итог.CH, PH, MO и LG всегда будут обязательными для подведения итогов.Но после подведения итогов по обязательным пунктам я хочу подвести итоги по другим пунктам, основываясь на следующем условии.Если MO ноль, возьмите лучшие два из BG, MT и GE.Если MO не равно нулю или больше или равно 0, я хочу взять лучшее из BG, MT или GE.

Таким образом, результат суммирования будет выглядеть следующим образом:

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

Я пробовал foreach, но не смог решить проблему.Как мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Вот более основной способ достижения этой цели, пожалуйста, найдите встроенный документ для объяснения,

$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
)
0 голосов
/ 03 июня 2019

Здесь мы можем сначала добавить все наши три массива, затем вычесть их в зависимости от условий, и наши коды будут выглядеть так:

$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,
    ],
],
];

$sum_arr = array();
foreach ($arr as $key => $arr2) {
    foreach ($arr2 as $key2 => $value) {
        $sum_arr[$key2]["score"] = array_sum(array_values($value));
        $temp = [$value["BG"], $value["MT"], $value["GE"]];
        arsort($temp);
        if ($value["MO"] === null) {
            $sum_arr[$key2]["score"] -= $temp[2];
        } elseif ($value["MO"] != null && $value["MO"] >= 0) {
            $sum_arr[$key2]["score"] -= $temp[2] + $temp[1];
        } else {
            continue;
        }

    }

}

var_dump($sum_arr);

Либо в моем коде есть ошибка, скорее всего, или я неправильно понял условия if, или менее вероятно, что требуемый вывод может быть неправильным. Тем не менее, это не должно быть сложно отладить его.

выход

array(3) {
  [5]=>
  array(1) {
    ["score"]=>
    int(300)
  }
  [6]=>
  array(1) {
    ["score"]=>
    int(310)
  }
  [7]=>
  array(1) {
    ["score"]=>
    int(300)
  }
}
...