tri de tableau tout simple

Wells
Invité n'ayant pas de compte PHPfrance

05 juin 2006, 19:44

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

ViPHP
ViPHP | 3607 Messages

05 juin 2006, 19:50

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...

Wells
Invité n'ayant pas de compte PHPfrance

05 juin 2006, 20:14

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 :)

Mammouth du PHP | 19672 Messages

05 juin 2006, 20:23

Il faudrait n'utiliser qu'un seul tableau pour garder la correspondance entre le score et le joueur et ensuite explorer la fonction sort()
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Wells
Invité n'ayant pas de compte PHPfrance

05 juin 2006, 20:46

C'est une piste que j'ai suivi sans succés, un exemple de code a me montrer?

Invité
Invité n'ayant pas de compte PHPfrance

05 juin 2006, 22:03

Un array_combine() ?

Wells
Invité n'ayant pas de compte PHPfrance

05 juin 2006, 22:55

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 :)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

05 juin 2006, 23:05

asort() ?!

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 2144 Messages

06 juin 2006, 00:34

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.

Eléphant du PHP | 113 Messages

06 juin 2006, 09:52

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

06 juin 2006, 10:32

Concernant le asort, il a un soucis majeur, si tu possede plusieurs clés identiques, ben tes enregistrements disparaissent, logique :)
Donc inutilisable malheureusement.
:?: :shock: :?:

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é ?! :))

Eléphant du PHP | 113 Messages

06 juin 2006, 10:46

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



:?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

06 juin 2006, 10:46

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

:idea:
Modifié en dernier par sadeq le 06 juin 2006, 11:05, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

06 juin 2006, 10:53

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 :)

Eléphant du PHP | 113 Messages

06 juin 2006, 12:09

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