Page 1 sur 1
tri de tableau tout simple
Posté : 05 juin 2006, 19:44
par Wells
Bonjour a tous, je me présente a vous acar je me prend la ette sur un probleme, qui je suis sur, à une solution toute simple.
Je recupere une liste de nom:
Fred,Michel,Alban,ect....
Une liste de score:
10,20,5,8,ect...
Je voudrais faire un classement du meilleur au moin bon joueur.
Hors je n'arrive pas a trouver une fonction de tri qui fasse ca, c'est quand meme bizare.
C'est une problématique standard, donc si qq'un connait une méthode toute conne
NB: si plusieurs joueurs ont le meme score, ils doivent quand meme apparaitres.
merci a tous
Wells
Posté : 05 juin 2006, 19:50
par jojolapine
Si tu récupères tes données dpuis une base de donnée, voit du côté de ORDER BY dans ta requête...
Posté : 05 juin 2006, 20:14
par Wells
Oups pardon, oui j'ai oublier de preciser, ce classement doit se faire hors de toute requete SQL (sa serait pas un soucis sinon

)
Non la base est deux tableaux contenant les données, on ne peux pas faire autrement

Posté : 05 juin 2006, 20:23
par Cyrano
Il faudrait n'utiliser qu'un seul tableau pour garder la correspondance entre le score et le joueur et ensuite explorer la fonction sort()
Posté : 05 juin 2006, 20:46
par Wells
C'est une piste que j'ai suivi sans succés, un exemple de code a me montrer?
Posté : 05 juin 2006, 22:03
par Invité
Un array_combine() ?
Posté : 05 juin 2006, 22:55
par Wells
Non car le probleme est qu'aprés un tri les clé ne sont pas garder.
Genre tu as:
[0] = 1;
[1] = 10;
[2] = 5;
aprés tri:
[0] = 10;
[1] = 5;
[2] = 1;
les clés corespondes plus

Posté : 05 juin 2006, 23:05
par Truc
asort() ?!
Posté : 06 juin 2006, 00:34
par iclo
Je sais que c'est une question stupide, mais je l'a pose quand même 8) 8) Pourqoi ne peux-tu pas utiliser une base de donnée ? c'est juste que j'aime comprendre.
Posté : 06 juin 2006, 09:52
par Wells83
Parceque!
On va dire qu'il y a deux raisons pour laquelle je ne peux pas le faire via une requete:
1) parceque je veux connaitre la solution sans passer par la BDD
2) parceque dans certains cas, on est obliger de récuperer les scores et les noms via plusieurs requetes. Ce n'est evidement pas le cas ici car je choisit l'exemple le plus basique qui soit.
Ma problématique est plutot de dire, comment fait on simplement un tri sur plusieurs tableaux. S'en s'occuper d'ou viennent les données en amont.
Concernant le asort, il a un soucis majeur, si tu possede plusieurs clés identiques, ben tes enregistrements disparaissent, logique

Donc inutilisable malheureusement.
D'autres idées?
Wells
Posté : 06 juin 2006, 10:32
par Ryle
Concernant le asort, il a un soucis majeur, si tu possede plusieurs clés identiques, ben tes enregistrements disparaissent, logique

Donc inutilisable malheureusement.
Logique, logique, c'est vite dit : faudra m'expliquer comment tu peux avoir plusieurs clés identiques dans un tableau (associatif ou non d'ailleurs)...
Chaque "cellule" ou valeur est identifiée de manière unique par un index ou une clé. Si tu affectes deux valeurs différentes à une même clé, la première est écrasée par la seconde. Ca ne créer certainement pas une nouvelle clé de même nom, pointant vers une autre valeur (et heureusement, comment savoir quelle valeur il te retourne quand tu intéroge cette clé ?!

)
Posté : 06 juin 2006, 10:46
par Wells83
Vi pardon je dit des conneries ^^
Reprenont mon exemple, j'ai donc ce tableau la:
$tab['pierre']=12;
$tab['paul']=8;
$tab['jacque']=15;
si je fait un asort la dessus sa me donnera:
$tab[0]=15;
$tab[1]=12;
$tab[2]=8;
Du moins il me semble (j'ecrit ca de tete) que c'est ce qu'il se passé quand je faisait le test.
Du coup ben evidement on perd la corélation nom/points

Posté : 06 juin 2006, 10:46
par sadeq
C'est possible de trier dans un tableau structuré comme une base de données (tableau associatif à plusieurs colonnes) à condition de mettre la clé du tri dans la première colonne. Je t'explique, par l'exemple :
<?php
//Tableau de base
$t[0]["score"] = 1;
$t[0]["joueur"] = "Fred";
$t[1]["score"] = 10;
$t[1]["joueur"] = "Michel";
$t[2]["score"] = 5;
$t[2]["joueur"] = "Alban";
//Tri
sort($t); //Ascendant
$t= array_reverse($t); //combiné à sort = tri déscendant
//Affichage
echo "<pre>";print_r($t); echo "</pre>";
?>
Ce programme tri le tableau $t qui contient 3 lignes où chacune est porteuse de 2 colonnes de données : score et joueur
Pour trier $t par score ascendant on a mis la colonne "score" avant la colonne "joueur"
Pour réussir un tri décroissant on peut faire suivre sort par un array_reverse qui inverse le tableau et ainsi bidouiller un tri déscendant.
Avec cette solution les clés nommées ne bougent pas seuls les n° de rangs des lignes sont recalculés

Posté : 06 juin 2006, 10:53
par Ryle
Tout à fait Wells, mais, même s'il réindex l'ordre des cellules (ce qui est normal, on lui demande de faire du tri) il conserve quand même l'association clé / valeur, cf l'exemple dans la doc :
<?php
$fruits = array("d"=>"papaye",
"a"=>"orange",
"b"=>"banane",
"c"=>"ananas");
asort($fruits);
foreach ($fruits as $key => $val) {
echo "$key = $val\n";
}
?>
L'exemple ci-dessus va afficher :
Code : Tout sélectionner
fruits[c] = ananas
fruits[b] = banane
fruits[a] = orange
fruits[d] = papaye
Ils sont bien affichés par ordre alphabetique, et tu as toujours la bonne clé associée à sa valeur

Posté : 06 juin 2006, 12:09
par Wells83
Bon bon, ce soir vais avoir qq tests a faire ^^
Je vous tient au courant pour les deux solutions proposés.
Je vous donnerais la mienne aussi, sa peut tjs intéréssé qq'un ^^
Wells