Avatar billede caturn Nybegynder
05. oktober 2003 - 12:28 Der er 8 kommentarer og
1 løsning

Omvendt sortering af to-dimensionelt array

Hej!

Jeg har et array der for eks. kunne se sådan her ud:

array[0][0] = 167;
array[0][1] = "Hans";
array[1][0] = 45;
array[1][1] = "Bjarne";
array[2][0] = 201;
array[2][1] = "Jens";

Hvordan får jeg sorteret det efter tallet og navnene følger med deres opringelige tal sådan at arrayet ville blive:

array[0][0] = 201;
array[0][1] = "Jens";
array[1][0] = 167;
array[1][1] = "Hans";
array[2][0] = 45;
array[2][1] = "Bjarne";

Håber I kan hjælpe!
Avatar billede erikjacobsen Ekspert
05. oktober 2003 - 12:43 #1
Sådan ?

<?

$a[0][0] = 167;
$a[0][1] = "Hans";
$a[1][0] = 45;
$a[1][1] = "Bjarne";
$a[2][0] = 201;
$a[2][1] = "Jens";

function cmp ($a, $b) {
  if ($a[0] == $b[0]) return 0;
  return ($a[0] > $b[0]) ? -1 : 1;
}


usort($a,"cmp");

print_r($a);

?>
Avatar billede caturn Nybegynder
05. oktober 2003 - 13:24 #2
Kan du ikke forklare programmet linie for linie?
Avatar billede erikjacobsen Ekspert
05. oktober 2003 - 14:53 #3
Virker det? Læs om usort på http://php.net/usort
Avatar billede caturn Nybegynder
05. oktober 2003 - 15:08 #4
Ja det virker.
Avatar billede caturn Nybegynder
05. oktober 2003 - 15:09 #5
Læg et svar.
Avatar billede erikjacobsen Ekspert
05. oktober 2003 - 17:25 #6
Hvis du specificerer hvad du vil vide mere om, kan jeg måske forklare det ...
Avatar billede caturn Nybegynder
05. oktober 2003 - 20:50 #7
Du må meget gerne forklare funktionen punkt for punkt.
Avatar billede erikjacobsen Ekspert
05. oktober 2003 - 21:29 #8
Ok, da.

Det oprindelige array opfattes som et et-dimensionelt array af usort,
med indices: 0, 1 og 2 (eller hvor langt det nu er),

usort ved imidlertid ikke hvordan man har tænkt sig rækkefølgen af
elementer i det sorterede array, så hver gang det i sin interne
sorteringsalgoritme har brug for at sammenlige to indgange i sit
array, $a, kalder det funktionen "cmp" - eller hvad vi nu kalder den.

Funktionen "cmp" får så de to elementer fra arrayet med som argumenter.
Det er ikke så pædagogisk at det ene af dem så hedder $a - det er et andet $a,
end det vi sorterer; de kunne ligesågodt hedder $x og $y (men du ved:
klippe klistre).

Det er nu "cmp"-funktionens ansvar at kigge på disse to argumenter, $a og
$b, og afgøre og de er ens, eller den ene er mindre end den anden, eller
omvendt. De 3 udfald af funktionen skal give 3 forskellige returværdier:
0, -1 eller 1, og disse værdier bruger usort så.

De to argumenter er nu hver et et-dimensionelt array (vi har "skrællet"
den første dimension væk), hver med 2 elementer. Kun elementet på plads
0 interesserer os. Er de ens returneres 0, og ellers -1 eller 1. Jeg
ved ikke om du kender konstruktionen i linien der begynder med return?
Men det er bare en kort måde at skrive

  if ($a[0] > $b[0]) {
    return -1;
  } else {
    return 1;
  }
Avatar billede caturn Nybegynder
05. oktober 2003 - 21:50 #9
Ok. Måtte lige læse den et par gange for at forstå det. :-)

Tak skal du have.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester