2016-08-18 14 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)); 

を、私はそれぞれの最高の「5」のマークの平均を見つけたいですstudent:

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

私は質問が少し曖昧だと思う。各生徒の上位5学年の平均を求めていますか?または、すべての生徒の上位5学年の平均をまとめて求めていますか? – Sherif

+0

各学生の上位5の成績の平均を取得#Sherif – syed

答えて

0

いくつかの問題が、ちょうど交換してください、あなたの内foreach()で:私が正しく質問を理解していれば、次のコードでは、各学生のトップ5を追加するために使用することができます

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

:だから

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

スコアを配列に加え、その配列を平均します。

$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

現在取り組んでいるアプローチには3つの大きな問題があります。

  1. あなたがそれぞれの平均N時間を計算しているループ
  2. の各反復で$averageの値を上書きするには、あなたは間違って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) 
    } 
    */ 
    
    を言うため

    通知は、あなただけのトップ5スコアを平均しているので、あなたがcount($scores)で割る代わり5により必要はなく、実際に間違ってです。