Kom ihåg mig?
Home Menu

Menu


Problem att sortera en array.

 
Ämnesverktyg Visningsalternativ
Oläst 2008-10-07, 11:23 #1
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
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?
grinditwp är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-07, 11:33 #2
Björklunds avatar
Björklund Björklund är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jul 2006
Inlägg: 594
Björklund Björklund är inte uppkopplad
Mycket flitig postare
Björklunds avatar
 
Reg.datum: Jul 2006
Inlägg: 594
http://se.php.net/sort

Edit: Oops, läste för snabbt...
Björklund är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-07, 11:51 #3
orreborres avatar
orreborre orreborre är inte uppkopplad
Flitig postare
 
Reg.datum: Apr 2003
Inlägg: 309
orreborre orreborre är inte uppkopplad
Flitig postare
orreborres avatar
 
Reg.datum: Apr 2003
Inlägg: 309
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);
orreborre är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-07, 12:01 #4
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
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
grinditwp är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-07, 12:10 #5
orreborres avatar
orreborre orreborre är inte uppkopplad
Flitig postare
 
Reg.datum: Apr 2003
Inlägg: 309
orreborre orreborre är inte uppkopplad
Flitig postare
orreborres avatar
 
Reg.datum: Apr 2003
Inlägg: 309
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.
orreborre är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-07, 12:25 #6
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
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?
grinditwp är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-07, 13:06 #7
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
Ä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
eg0master är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-07, 14:05 #8
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
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 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-09, 08:49 #9
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
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!
grinditwp är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-10-09, 09:34 #10
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
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;
}
eg0master är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 15:09.

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