我有一个行数组,需要将其批处理成十行的组,然后对它们的值求和。
包含 13 行的示例数组:
[
['amount_paid' => 2050.00],
['amount_paid' => 2050.00],
['amount_paid' => 2050.00],
['amount_paid' => 2050.00],
['amount_paid' => 2050.00],
['amount_paid' => 2050.00],
['amount_paid' => 2050.00],
['amount_paid' => 2050.00],
['amount_paid' => 2050.00],
['amount_paid' => 2050.00],
['amount_paid' => 2050.00],
['amount_paid' => 2050.00],
['amount_paid' => 2050.00],
]
样本数组的所需结果:
[20500.0, 8200.0]
上面表示前 10 行的总和,然后是其余 3 行的总和。
我尝试的仅适用于前 10 个,我想不出如何处理每 10 个具有动态行数的数据。
for ($i = 0; $i < count($json); $i++) {
if ($i < 10) {
$subtotalamount += floatval($json[$i]['amount_paid']);
}
}
易于理解,您可以使用 array_chunk(),array_sum(),array_column() 如下所示:-
$new_array = array_chunk($array,10);
$sub_total_array = [];
foreach($new_array as $array){
$sub_total_array[] = array_sum(array_column($array,'amount_paid'));
}
print_r($sub_total_array);
具有range
、array_slice
和array_column
函数的简短解决方案:
// $arr is your initial array
$sub_totals = [];
foreach(range(0, count($arr), 10) as $k){
$sub_totals[] = array_sum(array_column(array_slice($arr, $k, 10), 'amount_paid'));
}
range(0, count($arr), 10)
- 生成包含一系列元素的数组。它会像[0, 10, 20]
一样.这些元素是每个 10 大小序列的边界array_slice($arr, $k, 10)
- 每个下一个边界$k
用于从初始数组中提取下一个 10 大小的序列/切片$arr
$ret = array();
$subtotalamount = 0;
for ($i = 0; $i < count($json); $i++) {
$subtotalamount += floatval($json[$i]['amount_paid']);
if ($i % 10 == 9) {
$ret[] = $subtotalamount;
$subtotalamount = 0;
}
}
if ($subtotalamount > 0) {
$ret[] = $subtotalamount;
}
试试这个,
$sumofall = array();
for ($i = 0; $i < count($json); $i++) {
if ($i % 10 == 0) {
$sumofeach = 0
for ($j=$i-10;$j<$i-1;$j++) {
$sumofeach += floatval($json[$i]['amount_paid']);
$sumofall[] = $sumofeach
}
}
$a = array (0 => array ( 'amount_paid' => 2050.00 ), 1 => array ( 'amount_paid' => 2050.00 ) , 2 => array ( 'amount_paid' => 2050.00 ) , 3 => array ( 'amount_paid' => 2050.00 ) , 4 => array ( 'amount_paid' => 2050.00 ) , 5 => array ( 'amount_paid' => 2050.00 ) , 6 => array ( 'amount_paid' => 2050.00 ) , 7 => array ( 'amount_paid' => 2050.00 ) , 8 => array ( 'amount_paid' => 2050.00 ) , 9 => array ( 'amount_paid' => 2050.00 ) , 10 => array ( 'amount_paid' => 2050.00 ) , 11 => array ( 'amount_paid' => 2050.00 ) , 12 => array ( 'amount_paid' => 2050.00 ) , 13 => array ( 'amount_paid' => 2050.00 ) ) ;
$b = array_column($a,'amount_paid');
$c = array_chunk($b,10);
$sum = [];
foreach($c as $arr){
$sum[] = array_sum($arr);
}
echo "sum = ";
print_r($sum);
@Anant的答案对应的函数式是使用 array_map()
。
代码:(演示)
var_export(
array_map(
fn($set) => array_sum(array_column($set, 'amount_paid')),
array_chunk($array, 10)
)
);
<小时 />在经典循环中,访问列值,并在将第一级索引除以 10 时使用截断的除法将总和值推入各自的组。
代码:(演示)
$result = [];
foreach ($array as $i => $row) {
$group = intdiv($i, 10);
$result[$group] = ($result[$group] ?? 0) + $row['amount_paid'];
}
var_export($result);