2017-01-23 138 views
0

我有一系列的列(1月,2月,3月等),我想平均每列的每列的值,但很多可能有。PHP中的平均列數

我:

protected function generateAverage($staff, $type) 
{ 
    $months = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 
    $staff = array_map(function ($row) use ($type) { 
     if ($row['row_type'] == $type) { 
      return $row; 
     } 
    }, $staff); 

    foreach ($staff as $key => $employee) { 
     $months[0] += $employee['amounts'][0]; 
     $months[1] += $employee['amounts'][1]; 
     $months[2] += $employee['amounts'][2]; 
     $months[3] += $employee['amounts'][3]; 
     $months[4] += $employee['amounts'][4]; 
     $months[5] += $employee['amounts'][5]; 
     $months[6] += $employee['amounts'][6]; 
     $months[7] += $employee['amounts'][7]; 
     $months[8] += $employee['amounts'][8]; 
     $months[9] += $employee['amounts'][9]; 
     $months[10] += $employee['amounts'][10]; 
     $months[11] += $employee['amounts'][11]; 
    } 
    $months = array_map(function ($value) use ($staff) { 
     return $value/(count($staff)/2); 
    }, $months); 
    $months[] = array_sum($months); 
    return $months; 
} 

下面是數據的樣本是進入上述功能:

array:6 [ 
    0 => array:4 [ 
    "amounts" => array:13 [ 
     0 => "30000.00" 
     1 => "30000.00" 
     2 => "30000.00" 
     3 => "30000.00" 
     4 => "30000.00" 
     5 => "30000.00" 
     6 => "30000.00" 
     7 => "30000.00" 
     8 => "30000.00" 
     9 => "30000.00" 
     10 => "30000.00" 
     11 => "30000.00" 
     12 => 360000.0 
    ] 
    "image" => "test.jpg" 
    "row_name" => "Target" 
    "row_type" => "target" 
    ] 
... 

用法:

$data['aggregates']['Target average'] = $this->generateAverage(array_values($data['staff']), 'target'); 

我的感覺一般計算是凌亂的,有沒有更好的方法來做到這一點?

回答

1

一對夫婦的小體積的減少

protected function generateAverage($staff, $type) 
{ 
    // create 12 months with 0 value 
    $months = array_fill(0, 12, 0); 
    // use array_filter instead of map 
    $staff = array_filter(function ($row) use ($type) { 
     return $row['row_type'] === $type; 
    }, $staff); 
    // do count outside loop 
    $staffCount = count($staff); 
    // loop employees and add up each month, dividing early 
    foreach ($staff as $employee) { 
     for ($i = 0; $i < 12; $i++) { 
      $months[$i] += $employee['amounts'][$i]/$staffCount; 
     } 
    } 
    return $months; 
} 

我不知道爲什麼你是2或你爲什麼除以員工總數在最後總結,我的功能只是每月平均。

0

由於您使用的是Laravel,因此您使用的大部分數據都是集合。因此,一個集合轉換成陣列之前,你可以使用avg() helper

$collection->avg($key); 
+0

他希望將特定數據的平均值跨越多個記錄。我不認爲任何平均功能可以神奇地弄清楚他想做什麼。 – NDM

+0

@NDM它看起來像從數據庫獲取數據,在這種情況下,最好使用查詢生成器的'avg()'輔助函數或集合'avg()'輔助函數。 –

0

我覺得你可以考慮使用array_colum,

1)array_column使所有的值的數組中的某個特定索引位置連續

$column1 = array_column($employee, 0); 
$column2 = array_column($employee, 1); 
$column3 = array_column($employee, 2); 
. 
. 
. 

2)count($columnX)獲取列數,其中X是列的索引

3)使用(1)和(2)根據需要計算平均值