web-dev-qa-db-fra.com

Dans PHP, comment fonctionne l'USort () fonctionne

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

23
Sarmen B.

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.

28
halfdan

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.

24
knittl

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.

10
Paul

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!

4
pat