PHP中的平均列

时间:2017-01-23 12:35:48

标签: php arrays laravel laravel-4

我有一系列专栏(Jan,Feb,Mar等),我想平均每一行的每列的值,但可能有很多。

我有:

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');

我觉得计算平均值的方式很混乱,有没有更好的方法呢?

3 个答案:

答案 0 :(得分: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,或者为什么你最后总结,我的功能只给出了每月的平均值。

答案 1 :(得分:0)

由于您使用的是Laravel,因此您使用的大部分数据都是集合。因此,在将集合转换为数组之前,您可以使用avg() helper

$collection->avg($key);

答案 2 :(得分: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)计算所需的平均值