php - 通过 3 PHP 循环计算 foreach 组
问题描述
希望你过得很好!请有想法的评论按 3 分组,然后第 4 收到一个月分组的值。这是我的以下数据:
$salaries =
[
[
'month'=>'January',
'salary'=>200
],
[
'month'=>'Februray',
'salary'=>300
],
[
'month'=>'March',
'salary'=>400
],
[
'month'=>'April',
'salary'=>500
],
[
'month'=>'May',
'salary'=>600
],
[
'month'=>'June',
'salary'=>700
],
[
'month'=>'July',
'salary'=>800
],
[
'month'=>'August',
'salary'=>900
],
[
'month'=>'September',
'salary'=>1000
],
[
'month'=>'October',
'salary'=>1100
],
[
'month'=>'November',
'salary'=>130
],
[
'month'=>'December',
'salary'=>1200
]
];
我尝试了这段代码:每 3 次循环在 foreach 循环中求和值
但我不知道用总和指定第四个,在我看来循环
如果可能的话,我想要这个:
Array
(
[0] =>
[
'month'=>'April'
'sum'=900
]
[1] =>
[
'month'=>'other month'
'sum'=1800
]
[2] =>
[
'month'=>'other month'
'sum'=2700
]
[3] =>
[
'month'=>'other month'
'sum'=2430
]
)
我试试这段代码:
$groupSum = [];
foreach (array_chunk($salaries , 3) as $key => $value) {
$groupSum[] = array_reduce($value, function ($sum, $item) {
$sum += $item['salary']; return $sum;
});
}
结果是:
Array (
[0] => 900
[1] => 1800
[2] => 2700
[3] => 2430
)
解决方案
一个(非常)基本的解决方案(对于我的测试,我修正了二月份名称的错字):
function getNextMonth($month) {
$months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
$pos = array_search($month, $months);
if ($pos === false) {
throw new Exception('Invalid month');
}
if ($pos == 11) {
return 'January';
// should return also year + 1
}
return $months[$pos+1];
}
$i = 1;
$trimestreSum = 0;
$trimestres = [];
foreach($salaries as $month) {
$trimestreSum += $month['salary'];
if ($i % 3 == 0) {
array_push($trimestres, [
'month' => getNextMonth($month['month']),
'sum' => $trimestreSum,
]);
$i = 0;
$trimestreSum = 0;
}
$i++;
}
print_r($trimestres);
结果是
Array
(
[0] => Array
(
[month] => April
[sum] => 900
)
[1] => Array
(
[month] => July
[sum] => 1800
)
[2] => Array
(
[month] => October
[sum] => 2700
)
[3] => Array
(
[month] => January
[sum] => 2430
)
)
getNextMonth 可能是您需要添加到自己的代码中的唯一一段代码:)
很确定有更短(更优雅)的解决方案,但希望无论如何都能有所帮助。
推荐阅读
- python - 使用 MOTO 模拟 Python AWS SQS
- linux - IntelliJ:使用鼠标滚轮通过选项卡更改(循环)
- ios - NotificationCenter 在队列中监听
- javascript - netsuite suitescript 的 Javascript 健全性检查
- java - 如何将打印到文件的数组的奇怪输出转换为其原始值?
- javascript - luckyorange 分析正在捕获静态内容而不是 javascript 版本
- android - 单个活动:带有 AppBarLayout 的片段
- database-design - 如何在 Power BI 中分组?
- atom-editor - ATOM 如何启用选择“$”符号以及变量名?
- scala - 如何使用 getOrElseUpdate 在 Map 中增加 Int 值?