webForumDet fria alternativet

Sorta multidimmensionell array

4 svar · 257 visningar · startad av Peeer

PeeerMedlem sedan mars 20025 907 inlägg
#1

Hej!
Har en array som ser ut ungefär såhär

    [Willén, Joachim] => Array
        (
            [1] => Array
                (
                    [0] => 25:35.3
                    [1] => 0:00:00.0
                )

            [11] => Array
                (
                    [0] => 4:38:25.3
                    [1] => 0:15:44.4
                )

            [999] => Array
                (
                    [0] => 6:09:09.1
                    [1] => 0:22:55.1
                )

        )

    [Andersson, Björn] => Array
        (
            [1] => Array
                (
                    [0] => 25:39.6
                    [1] => 0:00:04.3
                )

            [11] => Array
                (
                    [0] => 4:22:43.9
                    [1] => 0:00:03.0
                )

            [999] => Array
                (
                    [0] => 5:57:19.4
                    [1] => 0:11:05.4
                )

        )
    [Sindballe, Torbjörn] => Array
        (
            [1] => Array
                (
                    [0] => 26:05.9
                    [1] => 0:00:30.6
                )

            [11] => Array
                (
                    [0] => 4:22:40.9
                    [1] => 0:00:00.0
                )

            [999] => Array
                (
                    [0] => 5:46:14.0
                    [1] => 0:00:00.0
                )

        )

Bakgrund: Arrayen är hämtad från en orienteringstävlingtävling där tiden för varje stämpling lagras. ['Andersson, Björn'][11][0] är alltså tiden löparen stämplade vid kontroll 11 och ['Andersson, Björn'][11][1] är tid efter ledaren vid den aktuella kontrollen.

Uppgift: Jag vill nu sortera arrayen kronologiskt och skriva ut en resultatlista. Arrayen ska sorteras på värdena som finns i ['löparnamn'][999][0] (eller [1]). I exemplet ska alltså 'Sindballe, Torbjörn' komma först, följt av 'Andersson, Björn' och sist 'Willén, Joachim'. Frågan är hur jag ska göra detta?

MatteMedlem sedan aug. 20002 975 inlägg
#2

Jag förstår inte riktigt vad [999][1] ska jämföras med och när, kan du utveckla det lite ?

Tar vi bara hänsyn till [999][0] skulle det kunna bli något på det här hållet:

function cmp ($a, $b) {

   $a = str_pad($a[999][0], 10, '0', STR_PAD_LEFT);
   $b = str_pad($b[999][0], 10, '0', STR_PAD_LEFT);
   if ($a == $b) {
      return 0;
   }
   return $a < $b ? -1 : 1;

}

uasort($array, 'cmp');
PeeerMedlem sedan mars 20025 907 inlägg
#3

[999][1] är tid efter ledaren (dvs. personen som var snabbast får tiden 00:00:00.0 och löparna bakom får ett tal som är högre än det). Men det spelar ingen roll, man skulle kunna sortera på båda (den som har kortast tid i [999][0] är ju onekligen snabbast) och din kod ovan ger ett korrekt resultat. Men vad gör den här raden egentligen?

 return $a < $b ? -1 : 1;

?

Följdfråga: En del löpare fullföljer av en eller annan anledning inte tävlingen, och kommer därför inte ha någon [999]. Hur gör man för att de som saknar detta index ska placeras sist i arrayen efter sorteringen?

MatteMedlem sedan aug. 20002 975 inlägg
#4
return $a < $b ? -1 : 1;

är samma sak som

if ($a < $b) {
   return -1;
} else {
   return 1;
}

Hur du löser det andra hänger lite ihop med hur du hanterar det från början, men du kan alltid göra så att du loopar igenom arrayen och plockar ut de som inte fullföljt.
Sen om du vill sortera dessa efter namn eller mellantid blir sedan upp till dig.

PeeerMedlem sedan mars 20025 907 inlägg
#5

Aok, varje dag lär man sig något nytt. Håller på med sorteringen av de som ej fullföljt nu, borde klara av det själv :)

Tack för hjälpen :)

/r Jo just ja. Om jag vill lägga in hela köret i en class, hur gör jag då med

uasort($resultArray, 'cmp');

? Vad ska det stå istället för cmp (cmp-funktionen ligger i klassen)?

127 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)