08. december 2004 - 15:56Der er
6 kommentarer og 1 løsning
Sortering af array m. usort skal sortere string float, int
Hejsa
Jeg har lavet denne lille funktion til sortering af et multidimensionelt array. I mit array er der værdier af typen float, int og string. Sammenligningen vil altid være mellem to værdier af samme type.
Lig nu bruger jeg 'strcasecmp' til at foretage sammenligningen. Den virker også i 905 af tilfældene men en gang i mellem ser det ud som om den ikke kan sortere int ordentligt.
Er der nogen der kender en erstatning for 'strcasecmp' som kan sammenligne både strings med strings, float med floats og int med int eller er der en anden, og smartere måde at gøre det på.
strenge sammenlignes fra venstre, tal sammenlignes på numerisk værdi. når du sammenligner strenge er "ABC" mindre end "C" når du sammenligner tal er 9 mindre end 1000 mend strengen "1000" er stadig mindre end strengen "9"
// Returnerer et sorteret multidimensionelt array ’$arr’ efter den valgte ’$key’ function multiSort($arr,$key,$order){ if ($order == 1){ if ( $key == 0 || $key == 1 ) { // sammenlign tal $compare = create_function('$a,$b','return 1*$a["'.$key.'"]-1*$b["'.$key.'"];'); } else { // sammenlign strenge $compare = create_function('$a,$b','return strcasecmp($a["'.$key.'"],$b["'.$key.'"]);'); } } else { if ( $key == 0 || $key == 1 ) { // sammenlign tal $compare = create_function('$a,$b','return 1*$b["'.$key.'"]-1*$a["'.$key.'"];'); } else { // sammenlign strenge $compare = create_function('$a,$b','return strcasecmp($b["'.$key.'"],$a["'.$key.'"]);'); } } usort($arr,$compare); return $arr; }
CoderDk din løsning virker umiddelbart fornuftig, men jeg foretrækker jakoba's, da den har det hele samlet i en funktion der hedder multisort (jeg kalder den ca. 100 steder i min kode og gider ikke rette det til :P)
Jakoba, den virker på det aray jeg viste herover, jeg bliver dog nød til at lave den mere generel, da det array jeg viste Jer er typisk men ikke den eneste type.. nogle gange er det kun strings, andre gange blandet andre gange kun floats..
Dvs jeg skal have ændret:
if ( $key == 0 || $key == 1 )
til noget i stil med:
if (is_numeric($arr[$key]))
Men det havde jeg ikke succes med =/ Hvordan gør jeg det smartest?
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.