2016-08-18 76 views
-1

我的学生的名字'和“分数”多维数组获取每个数组的平均值为:从多维数组

$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/>'; 
} 

我的问题是,不是给所有学生的平均水平,这是给只有第一个学生“爱丽丝”的平均值。我该如何获得所有学生的平均水平?

+0

您正在计算生成总数的同一个循环内部的平均值。这实际上应该在内部循环之外(你回应平均值)。 – scrappedcola

+0

我认为这个问题有点模糊。你是否想要得到每个学生前五名成绩的平均水平?或者你是否要求统计所有学生的前五个年级的平均水平? – Sherif

+0

获得每个学生的前5个年级的平均数#Sherif – syed

回答

0

的几个问题,但只需更换你的内心foreach()有:

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

所以:

foreach ($students as $student => $key){ 
    echo $student . '<br>'; 
    arsort($key); 
    $value = array_slice($key, 0,5); 
    $average = array_sum($value)/count($value); 
    echo $average . '<br/>'; 
} 
+0

这是工作......谢谢:) – syed

+0

还有一件事,如果我们不想使用php函数'arsort'进行排序,'array_slice'用于限制数组和' 'array_sum'..我们如何在不使用这些函数的情况下执行相同的程序?使用循环或if_conditions? – syed

+0

我接受了你的回答#AbraCadaver – syed

0

如果我理解正确的问题,下面的代码可以用来增加每个学生的前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); 
0

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

  1. 您与每次循环覆盖的$average
  2. 您计算平均N次,每次得分
  3. 你错误地陈述平均为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_sum(array_slice($scores, 0, 5))/count($scores)其实是不正确,因为你只平均顶部5分数,你不必通过count($scores)划分,而是由5代替。