WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Problem att sortera en array. (https://www.wn.se/forum/showthread.php?t=32406)

grinditwp 2008-10-07 11:23

Låt oss säga att jag har en array enligt exemplet nedan:

Kod:

$player[0]['name'] = 'Björn';
$player[0]['nr'] = 2;
$player[0]['id'] = 1;

$player[1]['name'] = 'Mia';
$player[1]['nr'] = 7;
$player[1]['id'] = 2;

$player[2]['name'] = 'Kalle';
$player[2]['nr'] = 4;
$player[2]['id'] = 3;

$player[3]['name'] = 'Anna';
$player[3]['nr'] = 12;
$player[3]['id'] = 4;

Nu vill jag lista ut detta:

Kod:

for($i = 0; $i sizeof($player); $i++){
    echo $player[$i]['name'] . ', ';
}

Detta resulterar i: Björn, Mia, Kalle, Anna,

Låt oss säga att jag skulle vilja få ut det hela enligt bokstavsordning, eller att det sorteras ut efter id eller nr. Hur gör jag då?


Jag har lekt med array_multisort utan direkt lyckade resultat.
Någon som kan ge ett exempel?

Björklund 2008-10-07 11:33

http://se.php.net/sort

Edit: Oops, läste för snabbt...

orreborre 2008-10-07 11:51

Det är inga problem alls:
Kod:

$player = array();

$player[0]['name'] = 'Björn';
$player[0]['nr'] = 2;
$player[0]['id'] = 1;

$player[1]['name'] = 'Mia';
$player[1]['nr'] = 7;
$player[1]['id'] = 2;

$player[2]['name'] = 'Kalle';
$player[2]['nr'] = 4;
$player[2]['id'] = 3;

$player[3]['name'] = 'Anna';
$player[3]['nr'] = 12;
$player[3]['id'] = 4;

$name = array();
$nr = array();
$id = array();

foreach($player as $k => $v)
{
        $name[$k] = $v['name'];
        $id[$k] = $v['id'];
        $nr[$k] = $v['nr'];
}

//Sort on name
array_multisort($name, SORT_ASC, $id, $nr, $player);
print_r($player);

//Sort on id
array_multisort($id, SORT_ASC, $name, $nr, $player);
print_r($player);

//Sort on nr
array_multisort($nr, SORT_ASC, $id, $name, $player);
print_r($player);


grinditwp 2008-10-07 12:01

Citat:

Originally posted by orreborre@Oct 7 2008, 11:51
Det är inga problem alls:
Kod:

player = array;
player0name = Björn;
player0nr = 2;
player0id = 1;
player1name = Mia;
player1nr = 7;
player1id = 2;
player2name = Kalle;
player2nr = 4;
player2id = 3;
player3name = Anna;
player3nr = 12;
player3id = 4;
name = array;
nr = array;
id = array;
foreachplayer as k = v
{
        namek = vname;
        idk = vid;
        nrk = vnr;
}
//Sort on name
array_multisortname, SORT_ASC, id, nr, player;
print_rplayer;
//Sort on id
array_multisortid, SORT_ASC, name, nr, player;
print_rplayer;
//Sort on nr
array_multisortnr, SORT_ASC, id, name, player;
print_rplayer;


Tack för ditt snabba svar. Du skulle inte vilja utveckla vad som egentligen händer och fötter här? :P

orreborre 2008-10-07 12:10

Citat:

Originally posted by grinditwp@Oct 7 2008, 11:01

Tack för ditt snabba svar. Du skulle inte vilja utveckla vad som egentligen händer och fötter här?


Ja, det kanske man skulle gjort :)

Det första du gör (foreach) är att skapa referensarrayer för att få fram kolumnerna som du kan sortera utifrån.
Sedan sorterar du $player ASC (stigande) utifrån referensarrayen $name o.s.v. för de andra sorteringskolumnerna.

Kan inte påstå att jag är riktigt haj på det där, men jag vet att det fungerar om man gör som jag visade. :)

grinditwp 2008-10-07 12:25

Citat:

Ursprungligen postat av orreborre
Citat:

Ursprungligen postat av grinditwp
Tack för ditt snabba svar. Du skulle inte vilja utveckla vad som egentligen händer och fötter här?

Ja, det kanske man skulle gjort
Det första du gör (foreach) är att skapa referensarrayer för att få fram kolumnerna som du kan sortera utifrån.
Sedan sorterar du player ASC (stigande) utifrån referensarrayen name o.s.v. för de andra sorteringskolumnerna.
Kan inte påstå att jag är riktigt haj på det där, men jag vet att det fungerar om man gör som jag visade.

Heh, tack, skumt att det inte står något om din lösning på http://se.php.net/array_multisort

Lösningen verkar en aning komplicerad, men funkar det så funkar det. :) Tack så mycket.

Någon annan som har mer att tillägga så får ni gärna göra det, för att reda upp detta ännu mer. T.ex. Måste man verkligen skapa en referennsearray?

En annan fråga som har med det hela att göra. Finns det någon skillnad på att skapa arrayen $player[$i]['name'] och $player['name'][$i], rent tekniskt då. Fördelar och nackdelar?

eg0master 2008-10-07 13:06

Även om du efterfrågar hjälp med multisort tycker jag att usort är en bättre lösning (eftersom jag misstänker att du vill hålla ihop datat).
Kod:

function compare_helper($a, $b) {
 if ($a == $b) return 0;
 if ($a < $b) return -1;
 return 1;
}

function compare_name($a, $b) { return compare_helper($a['name'], $b['name']); }
function compare_nr($a, $b) { return compare_helper($a['nr'], $b['nr']); }
function compare_id($a, $b) { return compare_helper($a['id'], $b['id']); }

// Exempel:
usort($player, "compare_name");

http://se.php.net/manual/en/function.usort.php

grinditwp 2008-10-07 14:05

Citat:

Originally posted by eg0master@Oct 7 2008, 13:06
Även om du efterfrågar hjälp med multisort tycker jag att usort är en bättre lösning (eftersom jag misstänker att du vill hålla ihop datat).
Kod:

function compare_helpera, b {
 if a == b return 0;
 if a b return -1;
 return 1;
}
function compare_namea, b { return compare_helperaname, bname; }
function compare_nra, b { return compare_helperanr, bnr; }
function compare_ida, b { return compare_helperaid, bid; }
// Exempel
usortplayer, compare_name;

http://se.php.net/manual/en/function.usort.php

Tack! Funkar också bra. Känns hyfsat smidigt också.

grinditwp 2008-10-09 08:49

Citat:

Originally posted by eg0master@Oct 7 2008, 13:06
Även om du efterfrågar hjälp med multisort tycker jag att usort är en bättre lösning (eftersom jag misstänker att du vill hålla ihop datat).
Kod:

function compare_helper($a, $b) {
 *if ($a == $b) return 0;
 *if ($a < $b) return -1;
 *return 1;
}

function compare_name($a, $b) { return compare_helper($a['name'], $b['name']); }
function compare_nr($a, $b) { return compare_helper($a['nr'], $b['nr']); }
function compare_id($a, $b) { return compare_helper($a['id'], $b['id']); }

// Exempel:
usort($player, "compare_name");

http://se.php.net/manual/en/function.usort.php

Hej igen.
Tar upp denna tråden då det har uppkommit en fråga till. Sorteringen fungerade bra men! (alltid ett men... :))

Kod:

$player[0]['name'] = 'Björn';
$player[0]['nr'] = 2;
$player[0]['id'] = 1;

$player[1]['name'] = 'Mia';
$player[1]['nr'] = 7;
$player[1]['id'] = 2;

$player[2]['name'] = 'Kalle';
$player[2]['nr'] = 4;
$player[2]['id'] = 3;

$player[3]['name'] = 'Anna';
$player[3]['nr'] = 12;
$player[3]['id'] = 4;

Låt oss säga att jag är nöjd med sorteringen efter namn, men jag vill sedan att det sorteras efter id också.
Så att om två st heter Anna, så skall andra sorteringen ske efter id.

ex.

Anna, id 1
Anna, id 2

Som det är nu kan det mycket möjligt bli tvärtom.

Tack för visat intresse!

eg0master 2008-10-09 09:34

Om du utgår ifrån mitt exempel med usort så behöver du ju bara skapa en till compare funktion som du använder.
Kod:

function compare_name_id($a, $b) {
 $sort = compare_name($a, $b);
 if (0 == $sort) return compare_id($a, $b);
 return $sort;
}


grinditwp 2008-10-09 09:51

Citat:

Originally posted by eg0master@Oct 9 2008, 09:34
Om du utgår ifrån mitt exempel med usort så behöver du ju bara skapa en till compare funktion som du använder.
Kod:

function compare_name_ida, b {
 sort = compare_namea, b;
 if 0 == sort return compare_ida, b;
 return sort;
}


Ursäkta min dumhet. Hur då?
Jag fattar koden, men ser inte hur jag skall utveckla den för att sortera fler nivåer eller vad man kan kalla det.
Orkar du ge ett exempel där du sorterar ut enligt namn sedan id och sist men icke minst nr?

grinditwp 2008-10-09 10:40

Hittade tillsut en bra sida som förklarar det hela:
http://www.the-art-of-web.com/php/sortarray/

Tack alla som hjälp! Ha det najs!


Alla tider är GMT +2. Klockan är nu 22:57.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson