在PHP中从多维数组中查找平均值


Finding averages from a Multi-dimensional array in PHP

我有一个数组,它看起来像这样(以及赋值):

loop thru students {
     $count = 0;
     loop thru classes { 
          $myArr[$obj->student][$count] = $grade;
     }
}

我在一个表中有数据:沿着顶部标题的是类。sides沿线是学生。每个交叉引用的单元格都是学生的成绩。我希望最下面的行是一个班上所有学生的平均成绩。

我在上面的数组中有我需要的信息(第一部分是学生id,第二部分是班级数量:永远是一样的。

我正在努力提取我需要获得平均值的信息:

我基本上需要先循环到第二部分,以获得学生总数和平均成绩。我不确定我这样做是否是数组顺序的最佳方式。但这是重要的信息:外循环是学生,内循环是类:所以这就是为什么我选择了我使用的顺序

有人能帮我走上正轨吗?一开始似乎很琐碎。

编辑--按要求添加数据:

样本数据;学生证和成绩;(有些成绩是空白的,但请忽略并假设它们会被填写;我会处理这些)

  [18273372] => Array
        (
            [0] => 40%
            [1] => 50%
            [2] => 100%
            [3] => 20%
            [4] => ---
            [5] => ---
            [6] => ---
            [7] => ---
            [8] => ---
            [9] => ---
            [10] => ---
            [11] => ---
            [12] => 50%
            [13] => ---
            [14] => ---
            [15] => ---
        )

 [18273372] => Array
        (
            [0] => 50%
            [1] => 50%
            [2] => 100%
            [3] => 50%
            [4] => ---
            [5] => ---
            [6] => ---
            [7] => 55%
            [8] => ---
            [9] => 70%
            [10] => ---
            [11] => ---
            [12] => 50%
            [13] => ---
            [14] => ---
            [15] => ---
        )

我需要平均数;例如,职位(或级别)0平均为45%。同样,0-15表示16个不同的类。每个学生的0班是一样的。

编辑:

这是我的更新程序代码:

$avg[$obj->s_i_student_num][$count] = $gradebook->unitPercentage[$count];
                $totals = array();
                foreach($avg as $student_id => $scores) {
                      foreach($scores as $id => $percent) {
                            if ($percent == "---") { continue; } 
                            $percent = (int) $percent;
                            $totals[$id][] = $percent;
                      }
                }

这里有一种方法:循环查看结果,并按键将每个百分比保存到一个临时数组中,将它们分组在一起:

$totals = array();
foreach($test_data as $student_id => $scores) {
  foreach($scores as $id => $percent) {
    // Trim off the percent sign  
    $percent = (int) $percent;
    // Initialize array key if it's the first time
    if(!array_key_exists($id, $totals))
      $totals[$id] = array();
    $totals[$id][] = $percent;
  }
}

然后,在该数组上运行一次遍历,按键对所有结果进行平均,并将您的百分比符号添加回:

// Affect original: pass variable by reference (&)
array_walk($totals, function(&$value) {
  // Sum values, divide by the size of the array (average) then add % on
  $value = array_sum($value) / count($value) . '%';
});

print_r($totals)显示:

Array
(
    [0] => 45%
    [1] => 50%
    [2] => 100%
    [3] => 35%
    [12] => 50%
    [7] => 55%
    [9] => 70%
)

那里的关键点是每个数组中原始分数的关键点演示