首页 > 解决方案 > 通过 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
)

标签: phpforeachgrouping

解决方案


一个(非常)基本的解决方案(对于我的测试,我修正了月份名称的错字):

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 可能是您需要添加到自己的代码中的唯一一段代码:)

很确定有更短(更优雅)的解决方案,但希望无论如何都能有所帮助。


推荐阅读