Avatar billede Slettet bruger
19. juli 2014 - 13:32 Der er 3 kommentarer og
1 løsning

Sortere Array ud en bestemt rækkefølge

Jeg har denne array:

Array (
[0] => stdClass Object ( [bId] => 41 [bNavn] => Hans [bStilling] => chef)
[1] => stdClass Object ( [bId] => 42 [bNavn] => Niels [bStilling] => Menig)
[2] => stdClass Object ( [bId] => 43 [bNavn] => Lone [bStilling] => Leder)
[3] => stdClass Object ( [bId] => 44 [bNavn] => Kaj [bStilling] => Lærling)
[4] => stdClass Object ( [bId] => 45 [bNavn] => Karsten [bStilling] => Leder)
)...... osv

Jeg vil gerne sortere brugerne efter stilling i følgende rækkefølge:

Chef, Leder, Menig, Lærling...

Hvordan gøres det nemmest, jeg har kigget lidt på usort og uasort, men jeg kan ikke lige twiste hvordan min egen rækkefølge kan blive det der sorteres efter.
Avatar billede Slettet bruger
19. juli 2014 - 14:44 #1
Nååååå, så lykkes det at efter at have søgt google tyndt i 5 timer:

http://www.the-art-of-web.com/php/sortarray/
Afsnit 8 (8. Sorting based on a list of values)


function mySort($a, $b){
$sortorder = array( 'chef', 'Leder', 'Menig', 'Lærling');
      if($a->bStilling == $b->bStilling){
          return strcmp($a->bNavn, $b->bNavn);
      }
      $cmpa = array_search($a->bStilling, $sortorder);
      $cmpb = array_search($b->bStilling, $sortorder);
      return ($cmpa > $cmpb) ? 1 : -1;
}
usort($data['b'], 'mySort');
?>
Avatar billede arne_v Ekspert
20. juli 2014 - 01:58 #2
Jeg ville have kodet det noget anderledes idag.

I stedetfor:


$sortorder = array('President', 'Vice-President', 'Secretary', 'Member');

function my_sort($a, $b) {
    global $sortorder;
    if($a->position == $b->position) {
        return strcmp($a->name, $b->name);
    }
    $cmpa = array_search($a->position, $sortorder);
    $cmpb = array_search($b->position, $sortorder);
    return ($cmpa > $cmpb) ? 1 : -1;
}

usort($data, 'my_sort');


ville jeg have brugt:


$sortorder = array_flip(array('President', 'Vice-President', 'Secretary', 'Member'));

usort($data, function($a, $b) use($sortorder) { if($a->position == $b->position) return strcmp($a->name, $b->name);
                                                else return $sortorder[$a->position] - $sortorder[$b->position]; } );
Avatar billede Slettet bruger
20. juli 2014 - 02:54 #3
Hej arne, Tak for svaret, men hvorfor sådan? Nu kan jeg jo lære lidt :0) så jeg må heller spørge, hvad er fordelen ved din version?
Avatar billede arne_v Ekspert
20. juli 2014 - 02:58 #4
kortere kode

hurtigere kode (formoder jeg - har ikke testet)
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