[PHP] Meerdere array's sorteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Soul_
  • Registratie: September 2003
  • Laatst online: 11-02-2024
Ik heb verschillende array's van spelers die zouden moeten gesorteerd worden volgens score, gespeelde wedstrijden en gewonnen wedstrijden.

Ik heb de volgende array's:
$scores[]
$wedstrijden[]
$gewonnen[]

ik gebruik arsort($scores) om de scores te rangschikken en doe dan een foreach op scores en haal de wedstrijden en gewonnen wedstrijden er dan ook uit zoals dit:

foreach ($scores as $key => $val) {

$id = $key;
$score = $val;

$matches = $wedstrijden[$id];
$winst = $gewonnen[$id];
}

Nu zijn de spelers alleen gerangschikt volgens hun scores.
Mijn vraag is hoe kan ik als de scores gelijk zijn van sommige spelers, deze spelers rangschikken volgens gespeelde wedstrijden en als deze ook gelijk zijn hoe ik dit dan kan rangschikken volgens gewonnen wedstrijden ?
of is er een andere manier om dit makkelijker op te lossen ?

dus volgorde van rangschikking met als belangrijkste eerst is:
scores > wedstrijden (minst gespeeld) > winst

Bedankt

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Het is voor mij niet helemaal duidelijk hoe je de drie arrays initieel gesorteerd hebt en hoe die gelinkt zijn aan elkaar. Als je dat op een bepaalde manier wel kan achterhalen, zou je wellicht met usort wat kunnen proberen.

Het makkelijkste is als je php5.3 gebruikt, omdat je met een closure variabelen makkelijk in je closure scope kan krijgen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$scores = array(...);
$games  = array(...);
$won    = array(...);

usort($scores, function($a, $b) use ($games, $won) {
  if ($a == $b) {
        // Sort by number of games played
        $result = do_something_with($games);

        if (!$result) {
          // Sort by number of games won
          $result = do_something_with($won);
        }

        return $result;
    }
    // Sort by score
    return ($a < $b) ? -1 : 1;
});
Geen idee hoe je verder die arrays koppelt, als je dat puur op de keys doet wordt het lastiger omdat je met usort geen keys terug krijgt bij het sorteren en dat alleen bij array_walk kan.

Echter, array_multisort is verwant aan array_walk en dat zou je soortgelijk aan dit voorbeeld wel voor elkaar moeten krijgen:

PHP:
1
2
3
4
$data = array($scores, $games, $won);

array_multisort($scores, SORT_DESC, $games, SORT_DESC, $won, SORT_DESC, $data);
print_r($data);


Tot slot, mocht je dit zo direct uit een database trekken, kan je beter je query aanpassen. Als bijvoorbeeld dit in SQL je oude query is:
SQL:
1
SELECT score, games, won FROM mydata ORDER BY score

Kan je er gemakkelijk dit van maken:
SQL:
1
SELECT score, games, won FROM mydata ORDER BY score, games, won

[ Voor 9% gewijzigd door mithras op 15-01-2012 10:45 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Soul_: Als je code post, gebruik dan code tags a.u.b.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Kun je de lijst met spelers niet anders opbouwen, bijvoorbeeld zo:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$spelers = array(
     array(
         'score' => 3
         'gewonnen' => 1,
         'wedstrijden' => 2
    ),
     array(
         'score' => 5
         'gewonnen' => 1,
         'wedstrijden' => 5
    ),
    /* Enz... */
);


Volgens mij wordt het dan redelijk makkelijk om de boel met usort te sorteren.

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 10:47

Ventieldopje

I'm not your pal, mate!

Verwijderd schreef op zondag 15 januari 2012 @ 14:52:
Kun je de lijst met spelers niet anders opbouwen, bijvoorbeeld zo:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$spelers = array(
     array(
         'score' => 3
         'gewonnen' => 1,
         'wedstrijden' => 2
    ),
     array(
         'score' => 5
         'gewonnen' => 1,
         'wedstrijden' => 5
    ),
    /* Enz... */
);


Volgens mij wordt het dan redelijk makkelijk om de boel met usort te sorteren.
Ik zou gewoon voor de SQL oplossing die hier boven gegeven wordt gaan, daar is SQL immers voor!

Is het niet wat om een snippet "forum" of pagina te openen? Er zijn hier zo veel scholieren die een wedstrijden schema willen maken of andere school opdrachten. Om nou elke keer weer het zelfde antwoord te moeten geven hoe ze dit het makkelijkste/beste aan kunnen pakken lijkt me ook zo wat :>

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
In plaats van de boel op te slaan in arrays lijkt het me handiger om gewoon met classes/objecten te werken en die te sorteren. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Ventieldopje schreef op zondag 15 januari 2012 @ 15:15:
[...]


Ik zou gewoon voor de SQL oplossing die hier boven gegeven wordt gaan, daar is SQL immers voor!
Indien van toepassing is dat natuurlijk beter, maar ik zie de TS het nergens over SQL of welke database dan ook hebben. ;)

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Ventieldopje schreef op zondag 15 januari 2012 @ 15:15:
Is het niet wat om een snippet "forum" of pagina te openen? Er zijn hier zo veel scholieren die een wedstrijden schema willen maken of andere school opdrachten. Om nou elke keer weer het zelfde antwoord te moeten geven hoe ze dit het makkelijkste/beste aan kunnen pakken lijkt me ook zo wat :>
Ik heb liever dat in de FAQ opgenomen wordt dat ze eerst hun leraar moeten vragen, en luidruchtig moeten klagen bij hun opleiding indien hun leraar hun niet verder kan helpen, :p.

[/offtopict]

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 10:47

Ventieldopje

I'm not your pal, mate!

YopY schreef op maandag 16 januari 2012 @ 09:23:
[...]


Ik heb liever dat in de FAQ opgenomen wordt dat ze eerst hun leraar moeten vragen, en luidruchtig moeten klagen bij hun opleiding indien hun leraar hun niet verder kan helpen, :p.

[/offtopict]
Sorry voor het offtopic maar ik vind dat je in dat laatste wel gelijk hebt. Ik heb ook bij meedere scholen "opleidingen" php gedaan maar dit was echt, echt diep triest gesteld met de kwaliteit. Ik snap dat je ergens moet beginnen, maar juist het begin is zo belangrijk en daar falen de meeste opleidingen in. Vooral door leraren die gewoon te weinig kennis hebben en een mentaliteit hebben van "ja maar het werkt toch". :X

Ik heb het idee dat wij meer en meer voor leraar gaan spelen hier en talloze keren iedereen min of meer het (zelfde) antwoord kunnen geven. Echt jammer om te zien :X

Anyway das een hele andere discussie, pm?

PHP:
1
2
3
<?php

header("Location: http://gathering.tweakers.net/forum/ontopic.php");

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • Soul_
  • Registratie: September 2003
  • Laatst online: 11-02-2024
Bedankt voor jullie reacties, heb het opgelost met array_multisort.
Het zit zo, er zijn zo 120 spelers die elk in een ploeg spelen, per ploeg zijn er 6 spelers en die 6 moeten telkens tegen andere 6 spelen van een andere ploeg tot dat elke ploeg tegen elkaar gespeeld heeft in een volledig seizoen.

De "applicatie" dat ze nu gebruiken slaat alleen de scores op van elke speler die tegen elkaar gespeeld heeft, zoals 2-0 2-1, 1-2 en 0-2.
Dus ik loop door heel de database en tel al deze scores op en kijk wie gewonnen/verloren heeft en zet dit in een array met id als de spelers id:
code:
1
2
3
4
5
6
7
 $data[] = array(
 'id' => $id, 
 'score' => $score,
 'gespeeld' => $gespeeld,
 'winst' => $winst,
 'verloren' => $verloren
 );

daarna doe ik array_multisort

Dit is niet voor school btw :P maar voor een vriend van me die dit gevraagd had.
Nogmaals bedankt voor jullie reacties
Pagina: 1