J'ai examiné la documentation PHP, les tutoriels en ligne et aucun d'entre eux, l'USort fonctionne réellement. J'ai un exemple que je jouais avec ci-dessous.
$data = array(
array('msg' => 'some text','month' => 11,'level' => 10),
array('msg' => 'some text','month' => 5,'level' => 10),
array('msg' => 'some text','month' => 8,'level' => 10),
array('msg' => 'some text','month' => 12,'level' => 10),
array('msg' => 'some text','month' => 2,'level' => 10),
array('msg' => 'some text','month' => 3,'level' => 10),
array('msg' => 'some text','month' => 4,'level' => 10),
array('msg' => 'some text','month' => 7,'level' => 10),
array('msg' => 'some text','month' => 10,'level' => 10),
array('msg' => 'some text','month' => 1,'level' => 10),
array('msg' => 'some text','month' => 6,'level' => 10),
array('msg' => 'some text','month' => 9,'level' => 10)
);
Je voulais être capable de trier les mois de 12 à 1 (depuis leur non-organisé) à travers une aide c'était la solution
function cmp($a, $b)
{
if ($a["month"] == $b["month"])
{
return 0;
}
return ($a["month"] < $b["month"]) ? -1 : 1;
}
usort($data, "cmp");
mais je ne comprends pas comment la fonction CMP trie le tableau. J'ai essayé d'imprimer chaque variable $ A et $ B comme ceci:
function cmp($a, $b)
{
echo "a: ".$a['month']."<br/>";
echo " b: ".$b['month']."<br/>";
echo "<br/><br/>";
}
et la sortie était
a: 3
b: 5
a: 9
b: 3
a: 3
b: 8
a: 6
b: 3
a: 3
b: 12
a: 1
b: 3
a: 3
b: 2
a: 10
b: 3
a: 3
b: 11
a: 7
b: 3
a: 4
b: 3
a: 12
b: 2
a: 5
b: 12
a: 12
b: 11
a: 8
b: 12
a: 5
b: 8
a: 2
b: 11
a: 6
b: 9
a: 7
b: 6
a: 6
b: 4
a: 10
b: 6
a: 1
b: 6
a: 9
b: 4
a: 7
b: 1
a: 10
b: 7
cela n'a aucun sens à la façon dont le tri fonctionne et pourquoi CMP ($ A, $ B) est utilisé. J'ai essayé d'imprimer tous ses processus comme vous pouvez le constater mais je ne suis venu à aucune solution à la façon dont tout cela fonctionne ..
merci
La fonction cmp
elle-même ne fait pas le tri. Il distingue simplement usort
si une valeur est inférieure, égale ou supérieure à une autre valeur. Par exemple. si $a = 5
et $b = 9
Il retournera 1 pour indiquer que la valeur de $b
est plus grand que celui de $a
.
Le tri est fait par usort
.
Le rappel fourni aux fonctions de tri de PHP dispose de trois valeurs de retour:
0: both elements are the same
-1 (<0): the first element is smaller than the second
1 (>0): the first element is greater
Maintenant, usort
utilise probablement une sorte de QuickSort ou Mergesort interne. Pour chaque comparaison, il appelle votre rappel avec deux éléments, puis décide s'il doit les échanger ou non.
Sort (USort () Utilise une implémentation de Quicksort Pour trier le tableau, il appelle votre cmp
fonction autant de fois que nécessaire pour trier complètement le tableau en utilisant cet algorithme.
Comme les autres ont mentionné, Usort utilise l'algorithme QuicksTort. Sur une note latérale, vous n'avez pas besoin de faire explicitement la comparaison entre deux chaînes. Vous pouvez utiliser les méthodes de comparaison de String de PHP.
La fonction que vous avez créée,
function cmp($a, $b)
{
if ($a["month"] == $b["month"])
{
return 0;
}
return ($a["month"] < $b["month"]) ? -1 : 1;
}
pourrait simplement être écrit comme suit
function compareMyStrings($a, $b){
return strnatcmp($a["month"], $b["month"]);
}
J'espère que cela t'aides!