【问题标题】:Calculate foreach group in loop by 3 PHP通过 3 PHP 循环计算 foreach 组
【发布时间】:2021-07-22 14:13:45
【问题描述】:

希望你做得很好! 请有想法的评论按 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
)

【问题讨论】:

  • 请向我们展示您的代码以及当前输出是什么。
  • 我试试这个代码:code $groupSum = []; foreach (array_chunk($salaries , 3) as $key => $value) { // echo $turnovers[$key]['month']; $groupSum[] = array_reduce($value, function ($sum, $item) { $sum += $item['salary']; return $sum; }); } code@waterloomatt
  • 结果是:codeArray ([0] => 900 [1] => 1800 [2] => 2700 [3] => 2430) code

标签: php foreach grouping


【解决方案1】:

一个(非常)基本的解决方案(对于我的测试,我修正了 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 可能是您需要添加到自己的代码中的唯一一段代码:)

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

【讨论】:

  • 谢谢,效果很好!我想要的,你拯救我的一天:)
  • 基于非常松散的需求,这个非常好。干得好。
  • @Armage ,是否可以列出其他月份,而不修改季度的计算,以便我们可以显示所有月份?
【解决方案2】:

试试这个

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

【讨论】:

  • 感谢您的回答
  • 对请求的结果进行逆向工程是一次有价值的尝试,但请注意“April”在第二个条目中,总和为 1800,而在 op 的示例输出中,它应该是总和为 900 的第一个条目(我也猜错了)
【解决方案3】:

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

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

【讨论】:

  • 感谢您的回答,我尝试像您一样将 4 分块,但不是我 nedd :这是结果 ``` Array ( [0] => Array ( [sum] => 1400 [月] => 四月 ) [1] => 数组 ( [sum] => 3000 [月] => 八月 ) [2] => 数组 ( [sum] => 3430 [月] => 十二月 ) ) ` `` 实际上,April 必须是 (January, February 和 March) 的总和。
  • @welson 你想要的是每 3 个月加上下个月的名称?
  • @StavNov 完全正确
  • @welson 你能编辑问题这样说吗? “我想用下个月的名字总结每 3 个月”。
猜你喜欢
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2020-05-17
  • 1970-01-01
相关资源
最近更新 更多