php - 如何根据某些条件对多维数组求和?
问题描述
$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
了,但我无法解决问题。我该如何解决这个问题?
解决方案
这是实现此目的的更核心方法,请查找内联文档进行解释,
$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
)
推荐阅读
- javascript - db 未定义 firebase firestore
- java - spring-webmvc/hibernate-validator 在测试期间不会使坏数据失效
- laravel - 如何使用特定的自定义数据播种 Laravel 工厂
- python - Pandas DataFrame 列(系列)的索引与 Dataframe 不同?
- react-native - 无需重新渲染即可在本机反应中切换组件
- azure - 来自 Azure 前门的 503 错误或空白页
- azure - 如何轻松为包含“t”权限的 azure blob 容器生成 SAS 令牌
- c# - SignalR C#(客户端和集线器)- 强类型示例
- sql - BIGQUERY 中的 COUNT() 和 GROUP BY
- c++ - 协程不分布在 asio::thread_pool 线程上