2017-01-26 49 views
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_targeted_target,将索引0添加到Bob Martinez__targeted_target的索引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; 
    } 

回答

0

刚去了你的数据和一个额外的数组保存结果:

$results = array(); 

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

     $results[$i] += $amount; 
    } 
} 

结果数组将包含所有交易者的资金。

未测试,但应该工作。

0

做这样的事情:

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'])); 
+0

我不断收到它的所有行相加,主要的问题包括actual_targeted。 actual_targeted需要分组并总结成targeted_target。 – imperium2335

+0

我使用strstr发送了另一个答案。 –

0

使用array_sum()功能。

array_sum()返回数组

另外值的总和,你说你要单独计算targeted targetactual targeted

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

foreach ($traders as $trader) { 
    $sum = array_sum($trader['anmounts']); 
    $trader['row_name'] === 'Actual targeted') ? $actual += $sum : $target += $sum; 
} 

也许你需要修改这一点来调整行为,但我想我明白了。

+0

谢谢,但问题是名称也是动态的,所以'实际目标'可以是任何东西。 – imperium2335

+0

@ imperium2335给数组添加一些静态标志。 –

0

@ imperium2335:

主要的问题我一直得到它所有的行总结,包括actual_targeted。 actual_targeted需要分组并总结成targeted_target。

那么做到这一点:

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

阅读: http://php.net/manual/en/function.strstr.php