2016-08-18 3 views
-1

ich ein mehrdimensionales Array von Studenten ‚name‘ haben und ‚Partituren‘:Erhalten Durchschnitt jedes Array aus einem mehrdimensionalen 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, 83, 79, 73) , 
       'eve' => array(91, 68, 85, 79, 84)); 

Jetzt will ich den Durchschnitt der höchsten ‚fünf‘ Marken von jedem finden Schüler:

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

Mein Problem ist, anstatt den Durchschnitt aller Studenten zu geben, ist es den Durchschnitt nur ersten Studenten ‚Alice‘ geben. Was soll ich tun, um den Durchschnitt aller Schüler zu erreichen?

+0

für einen berechnen Sie den Durchschnitt innerhalb der gleichen Schleife, die die Summe erzeugt. Dies sollte eigentlich außerhalb dieser inneren Schleife sein (wo Sie den Durchschnitt wiedergeben). – scrappedcola

+0

Ich denke, die Frage ist ein bisschen mehrdeutig. Fragen Sie nach dem Durchschnitt der 5 besten Noten jedes Schülers? Oder fragen Sie nach dem Durchschnitt der 5 besten Noten aller Schüler? – Sherif

+0

bekommen Durchschnitt der 5 besten Noten eines jeden Studenten #Sherif – syed

Antwort

0

Mehrere Probleme, aber ersetzen Sie einfach Ihre innere foreach() mit:

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

So:

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

Das funktioniert ... Danke :) – syed

+0

eine weitere Sache, was ist, wenn wir nicht die PHP-Funktionen 'arsort' zum Sortieren, 'array_slice' für die Begrenzung von Array und 'array_sum' .. Wie machen wir das gleiche Programm ohne diese Funktionen zu benutzen? Schleifen oder if_conditions verwenden? – syed

+0

Ich habe deine Antwort #AbraCadaver akzeptiert – syed

0

Wenn ich die Frage richtig verstanden habe, kann der folgende Code verwendet werden, um jeden Schüler Top-5 hinzufügen Scores zu einem Array und dann Durchschnitt dieser Array.

$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

Es gibt drei Hauptprobleme mit dem Ansatz, den Sie gerade machen.

  1. Sie den Wert $average mit jeder Iteration der Schleife für jede
  2. Sie sind der Berechnung der durchschnittlichen N faches Überschreiben punkten
  3. Sie als SUM([score1...score5])/N die durchschnittliche falsch Angabe

Hier ist die korrekte Implementierung des Durchschnitts der Top-5-Bewertungen jedes Schülers:

$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) 
} 
*/ 

Beachten Sie, dass $average = array_sum(array_slice($scores, 0, 5))/count($scores) zu sagen, ist eigentlich falsche, da Sie nur die besten 5 Noten im Durchschnitt sind, können Sie nicht von count($scores) sondern durch 5 stattdessen teilen müssen.

Verwandte Themen