2012-10-26 6 views
-3

Possible en double:
PHP - Multiple uasort functions breaks sortingsorte tableau multidimesional en php

Je tableau multidimensionnel en php avec 3 columns.I doit trier par "awarded_units" et si deux utilisateurs ont mêmes unités_décernées (bris d'égalité), l'unité ayant le moins d'unités choisies passera en premier.

user_id awarded_units selected_units 

15  5    2 
22  5    1 
3  4    2 
4  4    5 
5  4    1 

Comme vous le voyez, je l'avais déjà triés tableau sur la base de awarded_units en utilisant une fonction de tri multidimensionnel. Maintenant, je dois résoudre la condition de départage. Etant donné que user_id = 15 et user_id = 22 ont la même valeur award_units, donc user_id 22 doit venir en premier.

ordre sera

user_id awarded_units selected_units 

22  5    1 
15  5    2 
5  4    1 
3  4    2 
4  4    5 

me dire comment faire Veuillez this.Thanks

+1

Avez-vous regardé le tri en réseau avant de poster ici? http://php.net/manual/en/array.sorting.php – Peon

+2

PS: Créez-vous le tableau vous-même ou le recevez-vous d'une base de données? – Peon

+0

Voir en particulier [Exemple # 3 Tri des résultats de la base de données] (http://www.php.net/manual/fr/function.array-multisort.php#example-4641) dans le manuel PHP pour ['array_multisort'] (http://php.net/array_multisort) entry - si du tout vous avez besoin de résoudre cela dans PHP. Vous n'avez pas posté votre tableau, donc cela pourrait légèrement différer. – hakre

Répondre

1

Vous pouvez utiliser array_multisort:

$cols = array(); 
foreach ($multiArray as $key => $value) 
{ 
    $cols['awarded_units'][$key] = $value['awarded_units']; 
    $cols['selected_units'][$key] = $value['selected_units']; 
} 
array_multisort($cols['awarded_units'], SORT_DESC, $cols['selected_units'], SORT_ASC, $multiArray); 
+0

Le premier exemple de code était meilleur. Maintenant vous l'avez changé. – hakre

+0

Je pensais avoir mal lu la question, l'ai changé. –

0

Utilisez un custom sort function with usort:

usort($data, function($a, $b) { 
    if ($a['awarded_units'] == $b['awarded_units']) 
    { 
     return $b['selected_units'] - $a['selected_units']; 
    } 

    return $b['awarded_units'] - $a['awarded_units']; 
}); 

Vous pouvez également utiliser array_multisort pour cela, mais je préfère utiliser usort - plus de flexibilité et une meilleure lisibilité.

+0

Mais d'autre part 'usort' est compliqué parce que vous devez écrire du code pour la comparaison. Souvent, des erreurs se produisent avec cela - votre réponse est un bon exemple pour cela aussi. – hakre