Php 从多维数组中获取每个数组的平均值

Php 从多维数组中获取每个数组的平均值,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个多维的学生名字和分数数组: $student = array('Alice' => array(84, 93, 88, 100, 92, 84) , 'bob' => array(92, 47, 68, 79, 89) , 'charlie' => array(73, 85, 84, 69, 67, 92) , 'denis' => array(59, 92,

我有一个多维的学生名字和分数数组:

$student = array('Alice' => array(84, 93, 88, 100, 92, 84) ,
                 'bob' => array(92, 47, 68, 79, 89) , 
                 'charlie' => array(73, 85, 84, 69, 67, 92) , 
                 'denis' => array(59, 92, 83, 79, 73) , 
                 'eve' => array(91, 68, 85, 79, 84));
现在,我想找出每个学生最高“五”分的平均值:

foreach ($students as $student => $key){
    echo $student . '<br>';

    arsort($key);

    $value   = array_slice($key, 0,5);

    foreach ($value as $output){
        $total    += $output . '<br />';

        $average   = $total / count($value);

    }
    echo $average . '<br/>';
}
foreach($student as$student=>$key){
echo$student.“
”; 阿尔索特(钥匙); $value=array\u slice($key,0,5); foreach($value作为$output){ $total+=$output'
'; $average=$total/count($value); } 回声$average.“
”; }

我的问题是,不是给所有学生的平均分,而是只给第一个学生“爱丽丝”的平均分。我应该怎么做才能得到所有学生的平均数?

有几个问题,但只需将您的内部
foreach()
替换为:

$average = array_sum($value) / count($value);
因此:

foreach($student as$student=>$key){
echo$student.“
”; 阿尔索特(钥匙); $value=array\u slice($key,0,5); $average=数组总和($value)/计数($value); 回声$average.“
”; }
如果我正确理解了问题,可以使用以下代码将每个学生的前5名分数添加到一个数组中,然后对该数组求平均值

$scores = array();

foreach ($students as $student => $key){

     // Sort this student's scores
     arsort($key);

     // Add the top 5 scores to the scores array
     $scores = array_merge($scores, array_slice($key, 0,5));

}

// Average of all the top 5 scores
$average =  array_sum($scores) / count($scores);

您目前采用的方法存在三个主要问题

  • 循环的每次迭代都会覆盖
    $average
    的值
  • 您正在计算每个分数的平均
    N
    次数
  • 您将平均值错误地表示为
    SUM([score1…score5])/N
  • 以下是每个学生前5名平均分的正确实施:

    $students = [
        'Alice'   => [84, 93, 88, 100, 92, 84],
        'bob'     => [92, 47, 68, 79, 89],
        'charlie' => [73, 85, 84, 69, 67, 92],
        'denis'   => [59, 92, 83, 79, 73],
        'eve'     => [91, 68, 85, 79, 84],
    ];
    
    $averages = array_map(function($scores) {
        arsort($scores);
        return array_sum(array_slice($scores, 0, 5)) / 5;
    }, $students);
    
    var_dump($averages);
    
    /* this gives us something like ... 
    array(5) {
      ["Alice"]=>
      float(91.4)
      ["bob"]=>
      int(75)
      ["charlie"]=>
      float(80.6)
      ["denis"]=>
      float(77.2)
      ["eve"]=>
      float(81.4)
    }
    */
    

    请注意,说
    $average=array\u sum(array\u slice($scores,0,5))/count($scores)
    实际上是不正确的,因为您只对排名靠前的
    5
    分数取平均值,不需要除以
    count($scores)
    但改为
    5

    对于其中一个,您正在计算生成总数的同一循环内的平均值。这实际上应该在内部循环之外(在那里你会重复平均值)。我认为这个问题有点模棱两可。你是想得到每个学生前五名的平均成绩吗?或者你是在要求获得所有学生前5名的平均成绩?获得每个学生前5名的平均成绩#谢里夫还有一件事,如果我们不想使用php函数“arsort”进行排序,“array_slice”用于限制数组和“array_sum”。。我们如何在不使用这些函数的情况下执行相同的程序??使用循环或if_条件?
    $students = [
        'Alice'   => [84, 93, 88, 100, 92, 84],
        'bob'     => [92, 47, 68, 79, 89],
        'charlie' => [73, 85, 84, 69, 67, 92],
        'denis'   => [59, 92, 83, 79, 73],
        'eve'     => [91, 68, 85, 79, 84],
    ];
    
    $averages = array_map(function($scores) {
        arsort($scores);
        return array_sum(array_slice($scores, 0, 5)) / 5;
    }, $students);
    
    var_dump($averages);
    
    /* this gives us something like ... 
    array(5) {
      ["Alice"]=>
      float(91.4)
      ["bob"]=>
      int(75)
      ["charlie"]=>
      float(80.6)
      ["denis"]=>
      float(77.2)
      ["eve"]=>
      float(81.4)
    }
    */