按 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 可能是您需要添加到自己的代码中的唯一一段代码:)
很确定有更短(更优雅)的解决方案,但希望能有所帮助。
希望你一切顺利! 请有想法的评论按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 可能是您需要添加到自己的代码中的唯一一段代码:)
很确定有更短(更优雅)的解决方案,但希望能有所帮助。