Trier un tableau mulitdimensionnel

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Trier un tableau mulitdimensionnel

par Artus » 20 sept. 2006, 09:32

Ok je mets en resolu ;)

Merci a vous !

par Truc » 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.

par Artus » 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 ?

par Truc » 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 ?

par Artus » 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 ?

par Artus » 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 ^^

par Truc » 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:

par Cyrano » 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:

par Truc » 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.

par jojolapine » 16 sept. 2006, 10:57

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

par Truc » 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:

par jojolapine » 15 sept. 2006, 18:56

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

par Truc » 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"

Trier un tableau mulitdimensionnel

par Artus » 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