webForumDet fria alternativet

array_multisort hur?

10 svar · 343 visningar · startad av fredriksk

fredrikskMedlem sedan maj 2001211 inlägg
#1

Läser och läser på php.net men reder inte ut array_multisort riktigt...

Jag har en matris enligt följande:

$arr = array('namn' => 'bertil', 'ålder', => '67');
$arr = array('namn') => 'adam', 'ålder' => '19');

Nu vill jag sortera dessa på namn
hur skall array_multisort se ut?

Är inte riktigt med på detta... =)

MatteMedlem sedan aug. 20002 975 inlägg
#2

Det går även bra att använda usort:

function cmp($a, $b) {

   if ($a['namn'] == $b['namn']) {
      return 0;
   }
   
   return $a['namn'] < $b['namn'] ? -1 : 1;

}

usort($arr, 'cmp');
The_HulkMedlem sedan juni 20031 837 inlägg
#3

stämmer verkligen koden du har skrivit, tycker där finns lite får många , och )

andra raden i din PHP-kod, bygger den verkligen ut arrayen? ser ut som du tilldelar $arr helt nya värden.

Du har nog missat något när du bygger din matris.

om du sätter [] efter $arr så kanske det hade fungerat om du tar bort de överflödiga tecknen som finns på båda raderna.

har du testat din kod innan du publiserade den?

fredrikskMedlem sedan maj 2001211 inlägg
#4

ok... nu är jag änu mer förvirrad...

Om vi skall göra det jag skrev med array_multisort... hur gör man dårå?

MatteMedlem sedan aug. 20002 975 inlägg
#5

För att få utgångsläget riktigt för oss, hur är det egentligen din array / dina arrayer ser ut ?
Jag har uppfattad det så här:

$arr = array(
  array('namn'=>'bertil', 'ålder'=>'67'),
  array('namn'=>'adam', 'ålder'=>'19')
);

Eller om man visar det på ett annat sätt:

Array
(
    [0] => Array
        (
            [namn] => bertil
            [ålder] => 67
        )

    [1] => Array
        (
            [namn] => adam
            [ålder] => 19
        )

)
fredrikskMedlem sedan maj 2001211 inlägg
#6

Matte skrev:

Det går även bra att använda usort:

function cmp($a, $b) {

   if ($a['namn'] == $b['namn']) {
      return 0;
   }
   
   return $a['namn'] < $b['namn'] ? -1 : 1;

}


usort($arr, 'cmp');

Jag testkörde koden igår och det fungerade precis så som jag önskade! Men vilken konsig kod det är!!! Fattar inte mycket av den inte... =)

Speciellt det här:

return $a['namn'] < $b['namn'] ? -1 : 1;
fiddlerMedlem sedan juli 20023 617 inlägg
#7

fredriksk skrev:

Men vilken konsig kod det är!!! Fattar inte mycket av den inte... =)

Speciellt det här:

return $a['namn'] < $b['namn'] ? -1 : 1;

En elegant rad som returnerar antingen -1 eller 1 beroende på om vilkoret är sant eller falskt.

MatteMedlem sedan aug. 20002 975 inlägg
#8

Eller med andra ord

return $a['namn'] < $b['namn'] ? -1 : 1;

är en kortform för

if ($a['namn'] < $b['namn']) {
   return -1;
} else {
   return 1;
}
fredrikskMedlem sedan maj 2001211 inlägg
#9

aha...

Men nu kom jag på en pryl till som kanske gör att jag ändå måste använda multisort...

Nu vill jag nämligen att den skall sortera först på namn sen på ålder. Alltså namnen i bokstavsordning och sedan på namnet.

alltså: finns det två bertil så sorteras den yngsta bertil först...

Hur gör man det då?

MatteMedlem sedan aug. 20002 975 inlägg
#10

Det går i.o.f.s. fortfarande att använda usort():

function cmp($a, $b) {

   if ($a['namn'] == $b['namn']) {

      if ($a['ålder'] == $b['ålder']) {
         return 0;
      }

      return $a['ålder'] < $b['ålder'] ? -1 : 1;

   }
   
   return $a['namn'] < $b['namn'] ? -1 : 1;

}

usort($arr, 'cmp');
fredrikskMedlem sedan maj 2001211 inlägg
#11

Japp, funkis!

Jag tackar och bugar!

129 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)