PHP Array durchlaufen und auf nächsten Wert zugreifen

Gsus

schwankend^^
ID: 215354
L
22 Mai 2006
1.553
68
Hallo,
ich habe ein Array, das wie folgt aufgebaut ist:
Code:
Array
(
    [0] => Array
        (
            ['id'] => 1
            ['vorname'] => Kurt
            ['nachname'] => Müler
            ['schuss1'] => 4
            ['schuss2'] => 6
            ['schuss3'] => 2
            ['schuss4'] => 2
            ['gesamt'] => 14
        )
    [1] => Array
        (
            ['id'] => 2
            ['vorname'] => Peter
            ['nachname'] => Meier
            ['schuss1'] => 3
            ['schuss2'] => 4
            ['schuss3'] => 5
            ['schuss4'] => 1
            ['gesamt'] => 12
        )
    [2] => Array
         (
             ['id'] => 6
             ['vorname'] => Werner
             ['nachname'] => Schmidt
             ['schuss1'] => 4
             ['schuss2'] => 4
             ['schuss3'] => 5
             ['schuss4'] => 1
             ['gesamt'] => 14
         )
)

Aus diesem brauche ich nun den Schützen mit den meisten Punkten. Ist die Gesamtpunktzahl gleich, so ist Schuss1 etscheidend, ist auch Schuss2 gleich, haben beide den ersten Platz. Wie kann ich das realisieren? Habe es bereits geschafft, das Array nach ['gesamt'] zu sortieren, hier komme ich nun allerdings nicht weiter. Habe es mit foreach versucht, indem ich oben in dem sortierten Array angefangen habe es zu durchlaufen und es in ein anderes Array gespeichert habe. Dann wollte ich die foreach-Schleife it break beenden sofern der nächste Wert kleiner als der aktuelle Wert ist, aber wie kan ich auf den nächsten zugreifen?

Die Ausgabe sollte am Ende also "Kurt Müller" sein, das dieser zwar genausoviele Punkte wie Werner Schmidt hat, der erste Schuss allerdings gleich und der zweite besser war.

Vielen dank im vorraus!

mfg
Gsus
 
Wie ice-breaker schon schrieb: usort;

PHP:
<?php

$players = array(array('id' => 1, 'vorname' => 'Kurt', 'nachname' => 'Müller', 'schuss1' => 4, 'schuss2' => 6, 'schuss3' => 2, 'schuss4' => 2, 'gesamt' => 14), array('id' => 2, 'vorname' => 'Peter', 'nachname' => 'Meier', 'schuss1' => 3, 'schuss2' => 4, 'schuss3' => 5, 'schuss4' => 1, 'gesamt' => 12), array('id' => 3, 'vorname' => 'Werner', 'nachname' => 'Schmidt', 'schuss1' => 4, 'schuss2' => 4, 'schuss3' => 5, 'schuss4' => 1, 'gesamt' => 14));

function cmpshot($ashot, $bshot) {
  if($ashot == $bshot)
    return 0;
  else
    return ($ashot > $bshot) ? -1 : 1;
}

function mysort($a, $b) {
  if($a['gesamt'] == $b['gesamt']) {
    $tmp = cmpshot($a['schuss1'], $b['schuss1']);
    if($tmp != 0) {
      return $tmp; // Entscheidung anhand des ersten Schusses
    }
    $tmp = cmpshot($a['schuss2'], $b['schuss2']);
    return $tmp; // Definitive Entscheidung beim zweiten Schuss
  }
  return ($a['gesamt'] > $b['gesamt']) ? -1 : 1; // Höchster vor niedrigerem;
}

usort($players, "mysort");

print_r($players);

?>

Zur Erklärung, -1 als Rückgabewert der Funktion heißt, $a bekommt einen niedrigeren Index als $b. 0 bedeutet, es bleibt gleich und +1 bedeutet, $a bekommt einen höheren Index als $b.

Doppelplatzierungen müssen bei einem neuen Durchlauf kontrolliert werden, brauchen aber nur noch gegen den vorherigen Index kontrolliert zu werden.