Php 表中列的总计

Php 表中列的总计,php,laravel,laravel-4,Php,Laravel,Laravel 4,我想计算一个表中一系列列的总数,我该怎么做 下面是我想总结的数据示例: array:1 [ "traders" => array:6 [ "Jim Mayor__targeted_target" => array:2 [ "amounts" => array:13 [ 0 => 5 1 => 5 2 => 0 3 => 0 4 => 0

我想计算一个表中一系列列的总数,我该怎么做

下面是我想总结的数据示例:

array:1 [
  "traders" => array:6 [
    "Jim Mayor__targeted_target" => array:2 [
      "amounts" => array:13 [
        0 => 5
        1 => 5
        2 => 0
        3 => 0
        4 => 0
        5 => 0
        6 => 0
        7 => 0
        8 => 0
        9 => 0
        10 => 0
        11 => 0
      ]
      "row_name" => "Targeted target"
    ]
    "Jim Mayor__actual_targeted" => array:2 [
      "amounts" => array:13 [
        0 => 0
        1 => 1
        2 => 0
        3 => 0
        4 => 0
        5 => 0
        6 => 1
        7 => 1
        8 => 0
        9 => 0
        10 => 0
        11 => 0
      ]
      "row_name" => "Actual targeted"
    ]
    "Bob Martinez__targeted_target" => array:2 [
      "amounts" => array:13 [
        0 => 1
        1 => 0
        2 => 0
        3 => 0
        4 => 0
        5 => 0
        6 => 0
        7 => 0
        8 => 0
        9 => 0
        10 => 0
        11 => 0
      ]
      "row_name" => "Targeted target"
    ]
    "Bob Martinez__actual_targeted" => array:2 [
      "amounts" => array:13 [
        0 => 19
        1 => 45
        2 => 20
        3 => 26
        4 => 21
        5 => 10
        6 => 12
        7 => 20
        8 => 11
        9 => 2
        10 => 0
        11 => 0
      ]
      "row_name" => "Actual targeted"
    ]
...
我想将每个指数相加,例如,对于Jim Mayor_uuuTarget,指数0添加到Bob Martinez_uuuTarget的指数0中(这给出了1月份的总数)。它需要与数量不限的交易员合作

生成数据的函数:

protected function addRow($func, $params, $data, $year, $traderName, $rowName, $type, $image = null, $format = null, $underline = false)
    {
        $date = Carbon::createFromDate($year, 4, 1);
        $total = 0;
        $traderName = $traderName . '__' . str_replace(' ', '_', strtolower($rowName));
        for ($i = 1; $i < 13; $i++) {
            $params[1] = $date->year;
            $params[2] = $date->month;
            $result = call_user_func_array($func, $params);
            $data['traders'][$traderName]['amounts'][] = $result ? $result : 0;
            $total += $result;
            $date->addMonth();
        }
        $data['traders'][$traderName]['amounts'][] = $total;
        $data['traders'][$traderName]['row_name'] = $rowName;
        return $data;
    }
受保护的函数addRow($func、$params、$data、$year、$traderName、$rowName、$type、$image=null、$format=null、$underline=false)
{
$date=Carbon::createFromDate($year,4,1);
$total=0;
$traderName=$traderName.''.''.'.str'.'替换('''.''.''.'strtolower($rowName));
对于($i=1;$i<13;$i++){
$params[1]=$date->year;
$params[2]=$date->month;
$result=调用用户函数数组($func,$params);
$data['traders'][$traderName]['amounts'][]=$result?$result:0;
$total+=$result;
$date->addMonth();
}
$data['traders'][$traderName]['amounts'][]=$total;
$data['traders'][$traderName]['row\u name']=$rowName;
返回$data;
}

只需检查数据并将结果保存在其他数组中:

$results = array();

foreach ($traders as $trader) {
    foreach ($trader['amounts'] as $i => $amount) {
        if (!isset($results[$i])) {
            $results[$i] = 0;
        }

        $results[$i] += $amount;
    }
}
结果数组将包含所有交易者的总和


未测试,但应能正常工作。

执行以下操作:

function sumRowsByMonth($traders)
{
    $sums = array_fill(0, 12, 0);
    foreach($traders as $trader) {
        foreach($trader['amounts'] as $monthId => $amount) {
            $sums[$monthId] += $amount;
        }
    }
    return $sums;
}
我用这个测试:

$arr = array(
    'traders' => array(
        'Jim Mayor__targeted_target' => array(
            'amounts' => array(
                0  => 5,
                1  => 5,
                2  => 0,
                3  => 0,
                4  => 0,
                5  => 0,
                6  => 0,
                7  => 0,
                8  => 0,
                9  => 0,
                10 => 0,
                11 => 0,
            )
        ),
        'Bob Martinez__targeted_target' => array(
            'amounts' => array(
                0  => 19,
                1  => 45,
                2  => 20,
                3  => 26,
                4  => 21,
                5  => 10,
                6  => 12,
                7  => 20,
                8  => 11,
                9  => 2,
                10 => 0,
                11 => 0,
            )
        ),
    ),
);
var_dump(sumRowsByMonth($arr['traders']));
使用函数

array\u sum()
返回数组中的值之和

另外,您说过要分别计算
目标
实际目标

$actual = [];
$targeted = [];

foreach ($traders as $trader) {
    $sum = array_sum($trader['anmounts']);
    $trader['row_name'] === 'Actual targeted') ? $actual += $sum : $target += $sum;
}
也许您需要对此进行一点修改以调整行为,但我想我明白了。

@imperium2335:


我一直遇到的主要问题是,它将所有行相加,包括实际的行。实际的目标需要分组并分别汇总到目标

然后这样做:

function sumRowsByMonth($traders)
{
    $sums = array();

    foreach($traders as $traderName => $trader) {
        $type = strstr($traderName, '__');
        if( empty($sums[$type]) ) {
            $sums[$type] = array_fill(0, 12, 0);
        }

        foreach($trader['amounts'] as $monthId => $amount) {
            $sums[$type][$monthId] += $amount;
        }
    }
    return $sums;
}
请阅读以下内容:

我一直遇到的主要问题是,它将所有行相加,包括实际值。实际目标需要分组并分别汇总到目标目标。我使用strstr发送了另一个答案。谢谢,但问题是名称也是动态的,所以“实际目标”可以是任何内容。@imperium2335向数组添加一些静态标志。