PHP 中的平均列数

Average columns in 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');

感觉平均数的计算方式比较乱,有没有更好的方法?

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

$collection->avg($key);

一些小的足迹减少

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 或者为什么最后要求和,我的函数只给出每月的平均值。

我觉得你可以考虑用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)计算平均值