【问题标题】:Finding averages from a Multi-dimensional array in PHP从 PHP 中的多维数组中查找平均值
【发布时间】:2014-08-28 22:59:32
【问题描述】:

我有一个看起来像这样的数组(连同分配的值):

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

我在表格中有数据:沿着 top 标题是类。沿着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;

                      }
                }

【问题讨论】:

  • 您能否输出数据的 print_r 或样本数组。我认为没有人愿意打出样本进行测试。
  • @JonathanKuhn 我已经添加了数据

标签: php for-loop multidimensional-array


【解决方案1】:

这是一种方法:循环遍历您的结果并将每个百分比按键保存到一个临时数组中,并将它们全部组合在一起:

$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%
)

其中的键是每个数组中原始分数的键。 Demo.

【讨论】:

  • 实际上,没有必要强制转换为整数行,因为无论如何运行总和时都会发生这种情况。不过,将其保留在那里以供参考可能会很好。
  • 谢谢!我不认为我会很快得到这个结论。我确实在我的 php 日志中收到此错误,[] operator not supported for strings ;指向这一行:$totals[$id][] = $percent;(上面添加了代码)
  • 我已经更新了答案。您需要在使用之前初始化数组键 - 我的错,懒惰:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2014-12-13
相关资源
最近更新 更多