Trier un tableau mulitdimensionnel

Eléphanteau du PHP | 13 Messages

15 sept. 2006, 17:31

Salut tout le monde :)


Bon j'ai un petit probleme de tri pour un tableau de highscore pour un petit jeu que j'ai fait (http://artus.artworks.free.fr, page JEUX). En fait, je veux que le visiteur puisse trier les scores par pseudo, date, score, ou niveau atteint

Voila ma requete d'extraction des scores :
$table = mysql_query('SELECT @rank := @rank + 1 AS rank, login, score, niveau, timestamp FROM arkanoid ORDER BY score DESC, login ASC'); 
Je met tout ca dans un tableau pour pouvoir le trier (mais je n'y arrive pas) :
// Mise en forme du résultat
while ($donnees = mysql_fetch_array($table)) {
	for ($i=0; $i<=4; $i++) {
		$scores[$j][$i] = $donnees[$i];
	}
	$j++;
}
Je n'arrive pas a faire en sorte que le tableau soit classé par pseudo, ou score, en fonction des besoins de l'utilisateur (lors de clic sur les titres de colonnes).

Est ce que j'y m'y prends mal ?
QQ a t'il une idée qui pourrait m'aider ?

Merci d'avance

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

15 sept. 2006, 18:22

Salut,
Pour faire simple commmence par trier les données depuis la requete.
$tri_champ = (isset($_GET['tri']) ? $_GET['tri'] : "score";
$tri_ordre = (isset($_GET['ordre']) ? $_GET['ordre'] : "ASC";

$sql = "... FROM arkanoid ORDER BY ".$tri_champ." ".$tri_ordre;
avec des liens
<?php 
$tri_ordre = ($tri_ordre == "ASC") ? "DESC" : "ASC";
?>
<a href="page.php?tri=pseudo&ordre=<?php echo $tri_ordre ; ?>pseudo</a>"
voila un début de piste. Pour la syntaxe des affectations (? : ) regarde le post de la FAQ "opérateur ternaire"

/!\ 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 | 3607 Messages

15 sept. 2006, 18:56

hs: je n'arrive pas à jouer à ton jeu... c'est normal? (j'ai un écran noir)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

15 sept. 2006, 19:08

j'ai un écran noir
Bouton power de l'écran... la prise de ce même écran ? :langue:

Montre ce que tu as essayé :wink:

/!\ 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 | 3607 Messages

16 sept. 2006, 10:57

Pas gentil de se moquer :cry: ...
En fait c'est peut-être que j'ai pas flash à jour...
[/hs]

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

16 sept. 2006, 12:15

Flash ?!
Il y a un rapport :?

Mais si tu ne montre pas ce que tu as essayé de coder on ne pourra pas te guider.

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

Mammouth du PHP | 19672 Messages

16 sept. 2006, 12:22

...En fait c'est peut-être que j'ai pas flash à jour...
Possible parce que j'ai fait le test et de mon coté, ça a l'air de parfaitement fonctionner, mon score fut parfaitement minable, mais ça tournait très bien :mrgreen:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

16 sept. 2006, 13:03

Erf... :x
Je pensais que tu étais le posteur d'origine.
Forcément qu'il n'y a pas de rapport entre la requête et le flash :lol:

Le jeu fonctionne en tout cas :wink:

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

Eléphanteau du PHP | 13 Messages

18 sept. 2006, 11:05

Merci truc !

Désolé pour le tps de réponse, j'ai pas encore internet chez moi (et je trouve le tps long) alors je ne peux surfer qu'au boulot :)
Donc pas bete ton idée :) Je vais essayer ca !

Pour le feu flash, oui il demande le flash player 8 pour fonctionner.
Mais mon site marche plus la, j'espere que c'est FREE et pas un ptit malin qui hack mon site ^^

Eléphanteau du PHP | 13 Messages

18 sept. 2006, 12:23

Ca marche nickel mais il y a un petit HIC

En fait quand je classe par pseudo, ca me met bien un classement par ordre alphabetique mais tout mon classement est chamboulé puisqu'il se fait au niveau de la requete....
Donc le 1er devient le 1er au classement alphabetique, ou le dernier ^^

faut-il prévoir le classement en PHP plutot que dans la requete ?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 sept. 2006, 23:16

je classe par pseudo, ca me met bien un classement par ordre alphabetique mais tout mon classement est chamboulé puisqu'il se fait au niveau de la requete....
Donc le 1er devient le 1er au classement alphabetique, ou le dernier
C'est ce qui est demandé lors d'un classement par pseudo (nom, société...) ou alors j'ai pas compris. Peux tu montrer un exemple avec quelque pseudos histoire de bien suivre ton raisonnement ?

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

Eléphanteau du PHP | 13 Messages

19 sept. 2006, 10:00

C'etait moi avant...
Pas vu que j'etais en invité, le code est pas très lisible, je reposte :

Bah en fait, le 1er du classement est celui qui a le plus de point, que je classe par pseudo, ou par date, ou par score...

Donc il faut que ce classement ne change pas la place du 1er, faut juste qu'apparaisse en haut ou en bas de la liste le pseudo commencant par A, ou par Z dans le cas d'un "classement" par pseudo.

Mais en fait j'ai resolu mon probleme avec le post ci-dessous :
http://www.phpfrance.com/forums/voir_su ... .php#27971

Voici comment j'ai procedé :
<?php
// Initialisation des variables de classement
$tri_champ = (isset($_GET['tri']) ? $_GET['tri'] : 2);
if (isset($_GET['ordre'])) {
   ($_GET['ordre'] == 'SORT_ASC') ? $tri_ordre = 'SORT_DESC' : $tri_ordre = 'SORT_ASC'; }
else $tri_ordre = 'SORT_DESC';

// Requete d'extraction des scores
mysql_query('SET @rank = 0');
$table = mysql_query('SELECT @rank := @rank + 1 AS rank, pseudo, score, niveau, timestamp FROM arkanoid ORDER BY score DESC');
mysql_close();
$j = 0;

?>

   <div class="table_HS"><br />
   <h5>Meilleurs scores :</h5>
   
   <!-- Tableau des scores : COLONNES -->
   <table>
   <tr>
      <th class="rank"><a href="jeux.php?tri=0&ordre=<?php echo $tri_ordre; ?>">Rank</a></th>
      <th class="pseudo"><a href="jeux.php?tri=1&ordre=<?php echo $tri_ordre; ?>">Pseudo</a></th>
      <th class="score"><a href="jeux.php?tri=2&ordre=<?php echo $tri_ordre; ?>">Score</a></th>
      <th class="niveau"><a href="jeux.php?tri=3&ordre=<?php echo $tri_ordre; ?>">Niveau</a></th>
      <th class="date"><a href="jeux.php?tri=4&ordre=<?php echo $tri_ordre; ?>">Date</a></th>
   </tr>

<?php

// Mise en forme du résultat (classement dans un array)
while ($donnees = mysql_fetch_array($table)) {
   for ($i=0; $i<=4; $i++) {
      $scores[$j][$i] = $donnees[$i];
   }
   $j++;
}

// Appel de la fonction de classement
if ($tri_ordre == 'SORT_ASC') $scores = classement ($scores, $tri_champ, SORT_ASC);
else $scores = classement ($scores, $tri_champ, SORT_DESC);

// Affichage des scores
for ($a=0; $a<$j; $a++) {
?>

<!-- Tableau des scores : CONTENU -->
   <tr>
      <td class="rank"><?php echo $scores[$a][0]; ?></td>
      <td class="pseudo"><?php echo $scores[$a][1]; ?></td>
      <td class="score"><?php echo $scores[$a][2]; ?></td>
      <td class="niveau"><?php echo $scores[$a][3]; ?></td>
      <td class="date"><?php echo date('d/m/Y ', $scores[$a][4]); ?></td>
   </tr>
<?php
}
Et la fonction classement :
function classement ($tableau, $col, $direction) {
   foreach($tableau as $k=>$v){
      $cle[$k] = $v[$col];
   }
   array_multisort($cle, $direction, $tableau);
   return $tableau;
}
Qu'est ce que vous en pensez ?
Ya moyen d'optimiser ?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

19 sept. 2006, 14:53

Tu effectue le classement depuis la requete et non depuis un champ de la base de donnée donc tu n'as pas vraiment le choix.
Tu dois sortir une requête triée par score et apres un autre tri par programmation... c'est donc une bonne solution.

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

Eléphanteau du PHP | 13 Messages

20 sept. 2006, 09:32

Ok je mets en resolu ;)

Merci a vous !