Tri php avec usort()

Fermé
poudigne - 13 déc. 2009 à 16:55
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 - 13 déc. 2009 à 18:18
Bonjour,
Voilà mon probleme j'essaie de trier un fichier texte
forme:
param1;param2;param3;param4;param5;param6
param1;param2;param3;param4;param5;param6
param1;param2;param3;param4;param5;param6
...
Mon code:
function triTab() {
// je met en tableau mon fichier txt
$tabFilm = file("films.txt");
// je créé un nouveau array
$tabATrier = array();
// je créé un nouveau tableau bi dimensionnel pour le usort
for ($x = 0 ; $x < count($tabFilm) ; $x++){
$tabATrier[] = explode(";",$tabFilm[$x]);
}
//je le sort (la fonction 'compare' est plus bas);
uksort($tabATrier, "compare");
// je remet mon tableau en unidimensionnel
for($x = 0 ; $x < count($tabATrier) ; $x++){
$tabFinal[] = implode(";",$tabATrier[$x]);
}
//les print_r() sont la que pour le test
print_r($tabATrier);
echo "<br />";
print_r($tabFinal);
//je renvoie le tableau trier a ma function qui la appler
return $tabFinal;
}
function compare ($x, $y) {
/*
* $_GET['tri'] retourne un chiffre entre 0 et 5 selon le lien cliquer.
* il indique aussi l'indice a trier
* 0 = param1
* 1 = param2
* etc...
*/
if ($x[$_GET['tri']] == $y[$_GET['tri']]) // Pour trier sur l’élément #2
return 0; // par ordre croissant
else if ($x[$_GET['tri']] < $y[$_GET['tri']])
return -1;
else
return 1;
}
A voir également:

3 réponses

Tu a vu juste, en fait.. au debut je testais mon script avec usort() jai changer pour uksort() pour tester. par la suite jai rajouter mon code pour convertir en multi et remettre en uni, et j'ai oublier d'enlever le k ! :) je l'ai vu et je l'ai enlever et tout fonctionnais #1 !! :D
Donc a tu as raison, merci quand meme pour ton aide même si je l'ai trouvé seul !:P
1
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
13 déc. 2009 à 18:18
Et j'ai un autre conseil ^^
La fonction strcmp fonctionne bien pour ce que tu veux faire. Au lieu des if/else de compare, tu peux faire simplement :

return strcmp($x[$tri], $y[$tri]);
;)
1
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
13 déc. 2009 à 18:08
Salut,
approche intéressante du tri par colonne. Je vais m'en inspirer dans mes prochaines applications tiens :P

Sauf qu'il y a un unique problème : tu appelles ta fonction de tri avec les clés du tableau $tabATrier. Donc la fonction compare reçoit non pas les tableaux mais les clés…
Ce qui se passe, c'est que $x[$_GET['tri']] et $y[$_GET['tri']] sont indéfinis, et le test == renvoie toujours 0, car les deux valeurs sont équivalentes à false.


Pour que ton script marche, il suffit d'enlever un 'k'… xD
uksort => usort

Un petit conseil par ailleurs : pour garantir que ta valeur GET est bien un nombre (comme les paramètres GET sont visibles, il y a toujours un petit malin qui peut les trafiquer), fais un cast :

$tri = (int) @$_GET['tri'];

L'autre avantage du truc est que si la valeur n'est pas définie ou n'est pas un nombre, tu obtiens 0. Du coup, ton script trie sur la première colonne par défaut.
0