2011-03-21 2 views
3
$arr =array(
    28 => 23, 
    26 => 23, 
    15 => 12, 
    29 => 12, 
    1 => 12, 
    16 => 15, 
    30 => 15, 
    11 => 12, 
    8 => 23, 
    33 => 23 
); 

comment trier comme ceci:PHP Comment trier un tableau associatif d'abord par des clés puis par des valeurs?

8 => 23 
26 => 23 
28 => 23 
33 => 23 
16 => 15 
30 => 15 
1 => 12 
11 => 12 
15 => 12 
29 => 12 
+0

Votre tableau est simplement trié par valeur, oui? – JohnP

+0

Vous devez écrire votre fonction et l'utiliser comme uksort() callback – Yaronius

+0

J'ai fusionné vos deux comptes ensemble. [S'il vous plaît lire cette entrée Faq sur les comptes cookies.] (Http://meta.stackexchange.com/questions/44557/why-should-i-register-my-account/44562#44562) Aussi, StackOverflow n'est pas un forum; Si vous avez une nouvelle question, posez une nouvelle question. Si vous souhaitez inclure plus d'informations dans votre question, s'il vous plaît [modifier] (http://stackoverflow.com/posts/5377853/edit). Si vous souhaitez interagir avec l'une des personnes ayant répondu, vous pouvez leur laisser un commentaire. – Will

Répondre

5

Utilisez uksort, mais faire le tableau disponible à la fonction de comparaison pour la comparaison secondaire par valeur. En faire une variable globale serait le moyen le plus rapide et le plus sale.

+2

Belle solution. Utiliser une fermeture et passer une copie du tableau avec l'utilisation serait bien ... Notez que vous devrez réellement passer le tableau à une variable différente avant de le passer à la fermeture. – Jacob

0

C'est assez facile. Utilisez d'abord ksort puis utilisez asort pour le nouveau tableau trié. Vous trouverez votre résultat.

+2

Les fonctions de tri de tableaux de PHP utilisent quicksort qui est instable. Donc, cela ne peut pas être garanti. – Jacob

+0

@Jacob. Désolé mec je n'ai pas compris votre point. s'il vous plaît expliquez-moi et corrigez-moi ... –

+1

voir [Stabilité] (http://en.wikipedia.org/wiki/Sorting_algorithm#Classification). En quicksort si deux éléments sont égaux, ils ne seront pas garantis pour maintenir leur ordre d'origine. – Jacob

4

Vous pouvez utiliser uksort() qui permet au rappel personnalisé d'examiner à la fois les clés et, indirectement, leurs valeurs associées. Il suffit ensuite de décider quelles comparaisons faire et retourner la plus grande valeur que-moins-puis-ou-zéro appropriée pour influencer l'ordre de tri.

Voici un exemple utilisant une fermeture autour d'une variable temporaire (voir Jacob's comment) qui devrait avoir du sens.

$temp = $arr; 
uksort($arr, function ($a,$b) use ($temp) { 
    // Same values, sort by key ascending 
    if ($temp[$a] === $temp[$b]) { 
     return $a - $b; 
    } 
    // Different values, sort by value descending 
    return $temp[$b] - $temp[$a]; 
}); 
unset($temp); 
print_r($arr); 
Questions connexes