2017-01-26 4 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 добавлен в индекс 0 от Bob Martinez__targeted_target (это дает общее количество за январь). Он должен работать с неограниченным количеством трейдеров.

Функция, которая генерирует данные:

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 необходимо сгруппировать и суммировать отдельно для target_target. – imperium2335

+0

Я отправил другой ответ, используя strstr. –

0

Используйте array_sum() функцию.

array_sum() возвращает сумму значений в массиве

Кроме того, вы сказали, что вы хотите посчитать targeted target и actual 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 необходимо сгруппировать и суммировать отдельно для target_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

Смежные вопросы