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!
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);
?>
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;
}