8722 sujets

Développement web côté serveur, CMS

Bonjour à tous,

j'ai un tableau multidimensionnel qui comporte une image et son nombre de "Like"
Je veux trier mon tableau selon leur Like. Donc celui avec le plus de Like en premier et ainsi de suite. Pour l'instant je trie mon tableau... mais j'ai remarqué qu'il le triait comme si les likes étaient une chaîne..

Par exemple:
7 , 5 , 4 , 21 , 2 ,1

Donc le 21 se place devant le 2 et non devant le 7....!

Voici mon code


//Mes fonctions
function compare($a, $b)
{
    global $key;
    return strcmp($a[$key], $b[$key]);
}

function multi_sort($array, $akey)
{
    usort($array, "compare");
    return $array;
}

//Mon tableau
     $item[$cpt] = array(
                        "id_item" => $idItem,
                        "like_item" => $likeItem,
                         "photo_item" => $photoItem
                         );

//J'appelle la fonction pour trier mon tableau selon le nombre de like de l'item
$item= multi_sort($item, $key = 'like_item');


Quelqu'un voit le problème?
merci!
Modifié par JeanGab55 (22 Oct 2013 - 19:50)
Administrateur
Bonjour,

dans le cas général du tri numérique (pour un tableau simple), tu as natsort() et une description de toutes les fonctions de Tri des tableaux.

Ici tu te sers de strcmp pour trier ou pas chaque paire de valeur. Cette fonction :
a écrit :
Retourne < 0 si str1 est inférieure à str2; > 0 si str1 est supérieure à str2, et 0 si les deux chaînes sont égales.

Il faut que tu remplaces ça par une comparaison de tes 2 valeurs comme si elles étaient numériques, un simple :
return ($a[$key] < $b[$key]);

ou si c'est pas "<", c'est ">" j'ai pas testé Smiley smile

Par contre je suis pas dév, il y a peut-être 10 fois plus efficace que ton code ; je peux juste le corriger. Regarde parmi les fonctions natives de tri de PHP pour commencer Smiley smile genre array_multisort() avec SORT_NUMERIC
Modifié par Felipe (22 Oct 2013 - 20:59)
A la place de strcmp, pour obtenir un tri numérique, tu peux juste retourner $a-$b ou $b-$a; dans un cas ça trie en ordre croissant, et dans l'autre en ordre décroissant.
Si 21 se place avant 2, c'est que ta variable n'est pas un int... mais un string.

Elle a sans doute été définit genre : $key="21"; au lieu de $key=21. Et effectivement trier des strings de chiffres donnent parfois des résultats originaux.
Merci beaucoup pour vos réponses!

Voici ce que j'ai fait pour que sa fonctionne:


function compare($a, $b)
{
    global $key;
[b]    return $a[$key]-$b[$key];
[/b]}

function multi_sort($array, $akey)
{
    usort($array, "compare");
    return $array;
}


encore merci!
Modifié par JeanGab55 (23 Oct 2013 - 14:51)