web-dev-qa-db-fra.com

usort décroissant

Quand j'essaie d'appliquer le code ci-dessous à partir d'ici

usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});

cela me donne les résultats par ordre croissant.

Sortie:

0
0
0
0
0
0.29
1.09
6.33

En échangeant $ a et $ b, les résultats sont affichés par ordre décroissant, sauf une valeur.

usort($myArray, function($a, $b) {
    return $b['order'] - $a['order'];
});

Sortie:

6.33
1.09
0
0
0
0
0.29
0

je veux avoir les résultats dans l'ordre ci-dessous:

6.33
1.09
0.29
0
0
0
0
0

Comment puis-je obtenir la même chose?

16
000

Ma première hypothèse est que usort attend une réponse entière et arrondira vos valeurs de retour si elles ne sont pas des entiers. Dans le cas de 0,29, quand on le compare à 0, le résultat est 0,29 (ou -0,29), ce qui arrondit à 0. Pour usort, 0 signifie que les deux valeurs sont égales.

Essayez quelque chose comme ceci à la place:

usort($myArray, function($a, $b) {
    if($a['order']==$b['order']) return 0;
    return $a['order'] < $b['order']?1:-1;
});

(Je pense que c'est la bonne direction. Pour inverser l'ordre, changez le < en >)

36
Gareth Cornish

Changez simplement les $ a et $ b comme suit;

function sort($a, $b){ 
return strcasecmp($b->order, $a->order);
}
usort($myArray, "sort");
7
Chris Charlwood

Vous pouvez également simplement inverser le tableau une fois qu'il a été trié.

Commencez de la même façon que vous avez fait:

usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});

puis en inversant les résultats comme ceci:

$myArray = array_reverse($myArray);
0
Frits

Je sais que c'est vieux, mais j'espère que cela aidera quelqu'un. Le moyen le plus simple de définir un ordre décroissant consiste simplement à multiplier par un négatif (-1) comme indiqué ci-dessous. A bien fonctionné pour moi, avec le texte.

function DESC($a, $b)
{
    return strcmp($a["text"], $b["text"])*-1;
}

usort($results,"DESC");
0
Jimmy B.