Hallo,

Ik heb de volgende array, die ik graag wil sorteren zoals dat in Mysql kan, maar ik kom er niet uit. Omdat ik het in Mysql niet helemaal voor elkaar krijg heb ik in PHP de arrays samengevoegd. Nu wil ik ze eerst sorteren op de totale score (stand_punten), en vervolgens op r7, r6, r5, r4, r3, r2, r1 (omdat het laatste resultaat dan beslissend is). Iemand die weet hoe dit zou kunnen?

<?php Array ( 
[0] => Array ( [id] => 3 [land] => Belgium [stand_punten] => 200 [r1] => 80 [r2] => 70 [r3] => 70 [r4] => 70 [r5] => 46 [r6] => 70 [r7] => 70 ) 
[1] => Array ( [id] => 4 [land] => Netherlands [stand_punten] => 180 [r1] => 60 [r2] => 80 [r3] => 60 [r4] => 55 [r5] => 65 [r6] => 65 [r7] => 48 )
[2] => Array ( [id] => 2 [land] => Belgium [stand_punten] => 180 [r1] => 55 [r2] => 60 [r3] => 46 [r4] => 65 [r5] => 70 [r6] => 60 [r7] => 65 )
[3] => Array ( [id] => 1 [land] => Belgium [stand_punten] => 180 [r1] => 70 [r2] => 65 [r3] => 80 [r4] => 46 [r5] => 42 [r6] => 48 [r7] => 38 )
[4] => Array ( [id] => 5 [land] => Netherlands [stand_punten] => 160 [r1] => [r2] => [r3] => 65 [r4] => 80 [r5] => 80 [r6] => 80 [r7] => 80 )
[5] => Array ( [id] => 7 [land] => Belgium [stand_punten] => 160 [r1] => 48 [r2] => 42 [r3] => 55 [r4] => 38 [r5] => 38 [r6] => 50 [r7] => 60 )
[6] => Array ( [id] => 6 [land] => Belgium [stand_punten] => 160 [r1] => 28 [r2] => 36 [r3] => 50 [r4] => 37 [r5] => 60 [r6] => 55 [r7] => 55 )) ?>
Met ORDER BY wellicht? Iets als

SELECT [columns] FROM [table] ORDER BY stand_punten DESC, r7 DESC, r6 DESC, r5 DESC, r4 DESC, r3 DESC, r2 DESC, r1 DESC
In Mysql krijg ik het door de complexiteit van de tabellen niet voor elkaar. Ik wil daarom de array in PHP in de juiste volgorde krijgen. Ik neem aan dat er zoiets bestaat PHP om dat zo mooi te sorteren als in Mysql een Order By zou kunnen?
Misschien eerst proberen het in MySQL wel voor elkaar te krijgen?

Hoe staat het daarin en hoe moet het eruit komen?
Ramon van Dongen op 02/09/2016 23:56:45

Misschien eerst proberen het in MySQL wel voor elkaar te krijgen?

Hoe staat het daarin en hoe moet het eruit komen?


In Mysql wil ik het probleem ook graag tackelen, ik zou het eigenlijk beide willen weten. Ik heb even een vereenvoudigde variant in SQLFiddle gezet.

http://sqlfiddle.com/#!9/8c6ed/8

Ik wil graag de uitkomst zoals hij er nu staat, maar dan van alle spelers dus slechts één rij. Ik wil dus de punten van de wedstrijden 30, 31, 32 uit 2016 in één rij krijgen met de ID en naam

id - naam - r1 - r2 - r3
1 - Jan - 90 - 48 - 60
2 - Piet - 80 - 90 - 0

Alvast bedankt

Toevoeging op 03/09/2016 09:33:18:

Jan R op 03/09/2016 03:07:07

En als het dan toch niet gaat in sql probeer dan uasort, usort, uksort, enz eens

http://php.net/manual/en/function.uasort.php


Ik heb uiteraard gekeken naar die functies, maar ik kom er niet uit. Vandaar mijn vraag.
Op basis van de opgegeven array en wat aannames heb ik dit bedacht

<?php
// Obtain a list of columns
foreach ($multicol as $key => $row) {
	$sp[$key] = $row['stand_punten'];
	$r7[$key] = $row['r7'];
	$r6[$key] = $row['r6'];
	$r5[$key] = $row['r5'];
	$r4[$key] = $row['r4'];
	$r3[$key] = $row['r3'];
	$r2[$key] = $row['r2'];
	$r1[$key] = $row['r1'];
}


array_multisort(
	$sp, SORT_DESC,
	$r7, SORT_DESC,
	$r6, SORT_DESC,
	$r5, SORT_DESC,
	$r4, SORT_DESC,
	$r3, SORT_DESC,
	$r2, SORT_DESC,
	$r1, SORT_DESC,
	$multicol
	);

echo '<pre>';
print_r($multicol);
echo '</pre>';

?>


$multicol is de gefatsoeneerde array.

Het resultaat met hoop opmaak zie je hier :

http://adoptive.esy.es/multisort/
Wow, superbedankt man! Niet gedacht dat het nog zo lastig zou zijn.

Nog iemand die weet hoe ik het in Mysql ook voor elkaar kan krijgen?
Zoals het in de fiddle staat zou je het kunnen proberen door te selecteren uit een drievoudig gejoinde subselect, zodat je je ORDER BY gewoon kan gebruiken. Iets als ORDER BY r1 + r2 + r3, r3, r2, r1.
SELECT ... FROM (SELECT .... ORDER BY ...)

Reageren