php 将2d数组分组,每批10行,然后对每批中的值求和

l7mqbcuq  于 2023-01-08  发布在  PHP
关注(0)|答案(6)|浏览(150)

我有一个行数组,需要将其分批成10行一组,然后将其值求和。
具有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']);
    }
}
6uxekuva

6uxekuva1#

容易理解,您可以使用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);
relj7zay

relj7zay2#

包含rangearray_slicearray_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的序列的边界
  • 每个下一边界$k用于从初始阵列$arr中提取下一个10大小的序列/片段
vwkv1x7d

vwkv1x7d3#

$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;
}
whlutmcx

whlutmcx4#

试试这个,

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

kupeojn65#

$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);
q43xntqr

q43xntqr6#

与@Anant的答案相同的函数风格是使用array_map()
代码:(Demo

var_export(
    array_map(
        fn($set) => array_sum(array_column($set, 'amount_paid')),
        array_chunk($array, 10)
    )
);

在经典循环中,访问列值,并在将第一级索引除以10时使用截断被除数将求和值推入其各自的组中。
代码:(Demo

$result = [];
foreach ($array as $i => $row) {
    $group = intdiv($i, 10);
    $result[$group] = ($result[$group] ?? 0) + $row['amount_paid'];
}
var_export($result);

相关问题