按 3 PHP 计算循环中的 foreach 组

Calculate foreach group in loop by 3 PHP

希望你一切顺利! 请有想法的评论按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
    ]
];

我试过这个代码:Sum Value in foreach loop every 3 time looping

但我不知道用总和指定第 4 个,在我看来循环

如果可以的话,我想要这个:

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
)

更新: 似乎可以解决问题,但只是为了好玩:

$result = [];

// I guess $iMax can just be 12, but I don't know
for($nextTriI = 3, $iMax = count($salaries); $nextTriI < $iMax; $nextTriI += 3) {
    $triSum = 0;

    for($m = $nextTriI - 3; $m < $nextTriI; $m++) {
        $triSum += $salaries[$m]['salary'];
    }

    $result[] = [
        'month' => $salaris[$nextTriI]['month'], 
        'sum' => $triSum
    ];
}

print_r($result);

当然这假设有效数据,基于索引$salaries,等等


后代的旧答案:

我不确定这是你想要的,这不是最好的方法,但也许:

$groupSum = []; 
foreach (array_chunk($salaries , 4) as $value) { 
    $groupSum[] = array_reduce(
        $value, 
        function ($total, $item) { 
            $total['sum'] += $item['salary']; 
            $total['month'] = $item['month'];
            return $total; 
        },
        ['sum' => 0]
    ); 
}

试试这个

$groups = [];
$fourth = $salaries[3]['month'];

foreach(array_chunk($salaries,3) as $salary) {
  $sum = 0;
  $month = 'other month';

  foreach($salary as $k => $sal) {
    $sum += $sal['salary'];
    if($fourth == $sal['month']) {
      $month = $sal['month'];
    }
  }

  $groups[] = [
    'month' => $month,
    'sum' => $sum
  ];
}

结果

array(4) {
  [0]=>
  array(2) {
    ["month"]=>
    string(11) "other month"
    ["sum"]=>
    int(900)
  }
  [1]=>
  array(2) {
    ["month"]=>
    string(5) "April"
    ["sum"]=>
    int(1800)
  }
  [2]=>
  array(2) {
    ["month"]=>
    string(11) "other month"
    ["sum"]=>
    int(2700)
  }
  [3]=>
  array(2) {
    ["month"]=>
    string(11) "other month"
    ["sum"]=>
    int(2430)
  }
}

一个(非常)基本的解决方案(为了我的测试,我在 February 月份名称上修正了拼写错误):

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

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