28. juli 2005 - 15:45
Der er
3 kommentarer og 1 løsning
Avanceret sortering af multidimensionelt array.. HJÆLP!
Hejsa, Jeg har et multidimensionelt array, som jeg vil sortere efter to værdier. Det er lidt svært at forklare, men jeg har herunder lavet et eksempel: Følgende array... Array ( [0] => Array ( [input] => 0 [hits] => 3 [purehits] => 2 ) [1] => Array ( [input] => 4 [hits] => 5 [purehits] => 0 ) [2] => Array ( [input] => 7 [hits] => 0 [purehits] => 5 ) [3] => Array ( [input] => 12 [hits] => 2 [purehits] => 2 ) [4] => Array ( [input] => 14 [hits] => 2 [purehits] => 3 ) ) ...skal først sorteres efter antallet af 'purehits' og derefter efter antallet af 'hits'. Dvs. det sorterede array skal se sådan ud: Array ( [0] => Array ( [input] => 7 [hits] => 0 [purehits] => 5 ) [1] => Array ( [input] => 14 [hits] => 2 [purehits] => 3 ) [2] => Array ( [input] => 0 [hits] => 3 [purehits] => 2 ) [3] => Array ( [input] => 12 [hits] => 2 [purehits] => 2 ) [4] => Array ( [input] => 4 [hits] => 5 [purehits] => 0 ) ) Hvordan gør man det?
Annonceindlæg fra IBM
Jeg har lavet en funktion, som sorterer på en værdi: --- # Returnerer et sorteret multidimensionelt array ’$arr’ sorteret # efter den valgte ’$key’ og den valgte retning (op eller ned) 'order': # Lille->Stor: Order = 1 # Stor->Lille: Order != 1 function multiSort($arr,$key,$order){ if ($order == 1){ if (is_numeric($arr[0][$key])) { $compare = create_function('$a,$b','return 1*$a["'.$key.'"]-1*$b["'.$key.'"];'); } else { $compare = create_function('$a,$b','return strcasecmp($a["'.$key.'"],$b["'.$key.'"]);'); } } else { if (is_numeric($arr[0][$key])) { $compare = create_function('$a,$b','return 1*$b["'.$key.'"]-1*$a["'.$key.'"];'); } else { $compare = create_function('$a,$b','return strcasecmp($b["'.$key.'"],$a["'.$key.'"]);'); } } usort($arr,$compare); return $arr; } --- Jeg kan bare ikke overskue hvordan den kan skrives om til at sortere på flere værdier end kun en.
Prøv med: function cmp( $a, $b ) { if ( $a['purehits'] == $b['purehits']) { if ( $a['hits'] == $b['hits']) { return 0; } return ( $a['hits'] < $b['hits'] ) ? -1 : 1; } return ( $a['purehits'] < $b['purehits'] ) ? -1 : 1; } usort( $dit_array, 'cmp' );