Avatar billede flushout Nybegynder
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?
Avatar billede flushout Nybegynder
28. juli 2005 - 15:47 #1
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.
Avatar billede flushout Nybegynder
29. juli 2005 - 10:01 #2
Er der ikke nogen der kan hjælpe?? .. :'(
Avatar billede coderdk Praktikant
29. juli 2005 - 10:05 #3
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' );
Avatar billede flushout Nybegynder
31. juli 2005 - 20:17 #4
Jeg rettede den lidt til, men den virker =) Takker!
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