webForumDet fria alternativet

array_multisort hur?

PHP

10 svar · 345 visningar · startad av fredriksk

Medlem sedan maj 2001211 inlägg
Frågan#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... =)

Medlem 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');
Medlem 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?

Medlem 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å?

Medlem 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
        )

)
Medlem 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;
Medlem 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.

Medlem 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;
}
Medlem 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å?

Medlem 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');
Medlem sedan maj 2001211 inlägg
#11

Japp, funkis!

Jag tackar och bugar!

263 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)