用 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
)

解决方法

一个(非常)基本的解决方案(对于我的测试,我修复了二月月份名称的拼写错误):

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

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

,

更新:@Armage's answer 似乎可以解决问题,但只是为了好玩:

Column1 | Column2 | Column3
--------+---------+--------
A       |   X     |  Y
A       |   X     |  Y 

当然,这假定有效数据、基于索引的 $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
,

试试这个

$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)
  }
}