IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Classement avec des ex-æquos


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    maf
    maf est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 76
    Par défaut Classement avec des ex-æquos
    Bonjour à tous,

    Voilà j'ai établi un classement sur des scores seulement seul problèmes, j'aimerais que la varible $a plutôt que de s'ingrémenter normalement affiche la même place dans le classement pour deux scores égaux.

    Voici mon code, comment pourrais-je le modifier ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?
    $sql1 = "SELECT *  FROM `jeux`";
    $res1 = $con->sendSql($sql1);
    echo '';
    while ($row1 = mysql_fetch_array($res1, MYSQL_ASSOC)) {
     
    ?>
    <strong><?=stripslashes($row1["jeu1"])?></strong></br><?
    $sql = "SELECT `nom`,`score1`  FROM `scores` ORDER BY `score1` DESC";
    $a = 1;
    $res = $con->sendSql($sql);
    while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
     
    ?>
    <?=$a++?> // <?=stripslashes($row["nom"])?> // <?=stripslashes($row["score1"])?> </br>				
    <?
     
    }};
    ?>

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut
    Salut, il suffit de ne pas incrementer $a lorsque le score est identique au score précédent.

    Si le score actuel ,c.a.d $row["score1"], est égal au score précédent. Alors on ne doit pas incrémenter la place dans le classement, c.a.d $a.

    Comment peut-on comparer avec le score précédent ? C'est simple,
    on crée une variable $score_precedent et après chaque affichage du score on la remplit.

    Le seul problème c'est que avant le premier score il n'y a pas de score précédent, donc on initialise $score_précédent avec un score impossible, par exemple un score negatif, ou meme avec une chaine de charactere (vu que les scores sont des nombres).

    Voici que cela donnerait :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <?
    $sql1 = "SELECT *  FROM `jeux`";
    $res1 = $con->sendSql($sql1);
     
    echo '';
    while ($row1 = mysql_fetch_array($res1, MYSQL_ASSOC)) 
    {
      ?>
      <strong><?=stripslashes($row1["jeu1"])?></strong></br>
      <?
     
      $sql = "      SELECT `nom`,`score1`  
                          FROM `scores` 
                   ORDER BY `score1` DESC
                ";
      $res = $con->sendSql($sql);
     
      $a                       = 0           ;
      $score_precedent = 'dummy' ;
     
      while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) 
      {
         // Si le score est différent du score précédent, incrementer la position
         // dans le classement 
         if ($row['score1'] != $score_precedent)  $a++ ;
     
         echo $a.' // '.stripslashes($row['nom']).'  //  '.stripslashes($row['score1']).' </br>' ;
     
         //Sauvegarder le score 
         $score_precedent = $row['score1'] ;    
      }
    }
    ?>

    Voila c'etait pas bien complique. Aussi j'ai du changer la valeur d'initialisation de $a, car on l'incremente avant de l'afficher maintenant.

    Bon amusement ;-)

  3. #3
    maf
    maf est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 76
    Par défaut re
    Merci ça marche niquel ... (je t'avoue que c'est un de mes premier code) et je suis content qu'il fonctionne déjà ...

    Par contre pour ma culture, le dummy, on peut mettre n'importe quoi ?

    Et mnt si je répète la même opération pour plusieurs jeux (6 au total) et qu'après je souhaite faire un classement général. (les jeux ont pas tous le même poids donc pas possible de faire une somme des scores)
    Le mieux c'est de faire le total des variables par nom ...

    Mais là le problème que j'ai, c'est ok, la variable globale c'est une chaîne d'addition, mais ... comment mettre en relation le NOM avec la PLACE du jeu ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut
    Citation Envoyé par maf Voir le message
    Merci ça marche niquel ... (je t'avoue que c'est un de mes premier code) et je suis content qu'il fonctionne déjà ...
    Félicitations, tu es sur la bonne voie.
    Par contre il y a quelque chose que je ne comprends pas ...
    Dans ton code tous les jeux ont les mêmes scores car tu réaffiches pour chaque jeux le contenu de la table `scores`.

    Tu devrais afficher les scores 'par jeu', donc la table score devrait contenir une référence au jeu. Il devrait au moins y avoir une colonne dans la table `score` qui indique a quel jeu correspond un score. Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $sql = "        SELECT `nom`,`score1`, `jeu`  
                          FROM `scores`
                        WHERE `jeu` = '".$row1["jeu1"]."'
                   ORDER BY `score1` DESC
                ";
    PS: Souvent ce genre de référence, le nom du jeu, se font avec des clés. Dans la table `jeux` il y a surement une colonne id et dans la table `scores` une colonne jeux_id ou similaire. Alors la condition est plutôt jeu_id = $row1['id']. On appelle çà une foreign key (FK) ou clé étrangère.


    Par contre pour ma culture, le dummy, on peut mettre n'importe quoi ?
    A peu pres, le but c'est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($row['score1'] != $score_precedent)  $a++ ;
    dans ce bout de code le $a++ s'exécute la première fois.
    Apres il aura des valeurs 'pertinente' et réels.

    Donc Oui, tu pourrais y mettre n'importe quoi. Tant que ce n'est pas une valeur possible de $row['score1'].


    Et mnt si je répète la même opération pour plusieurs jeux (6 au total) et qu'après je souhaite faire un classement général. (les jeux ont pas tous le même poids donc pas possible de faire une somme des scores)
    Le mieux c'est de faire le total des variables par nom ...
    Si tu veux faire çà pour plusieurs jeux, alors comme je l'explique plus haut, tu dois commencer a afficher les scores 'par jeux'.

    Si tu souhaites faire un classement générale il faut savoir quels sont tes
    règles de calculs ... La première étape avant d'informatiser un problème
    c'est de l'expliquer en detail, donner un exemple. Pourrais-tu expliquer comment tu calcul ton classement générale.

    Mais là le problème que j'ai, c'est ok, la variable globale c'est une chaîne d'addition, mais ... comment mettre en relation le NOM avec la PLACE du jeu ?
    Je ne comprends pas tres bien. J'imagine que c'est lie au problème précédent. Dans l'absolu sinon, pour mettre des choses en 'relations' on utilise des tableaux nomme en php ex. $joueurs[$row['nom']][$row['jeu']] = $row['score1'] ; Alors par exemple tu auras les points de robert au Monopoly dans $joueurs['robert']['Monopoly']

  5. #5
    maf
    maf est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 76
    Par défaut re
    Alors j'explique mieux ...

    Tous les mois, les 5 jeux changent (et j'ai donc une table jeux avec les noms des jeux).

    Ensuite ma table score est donnée ainsi : (nom ; score 1 ; score 2 ; score 3 ; score 4 ; score 5)

    Après, on établit un classement général en fonction de la position de chaque personne à chaque jeu (étant donné que chaque score n'a pas le même poids je peux pas faire un score total)

    Je répète donc 5 fois mon bout de code qui m'affiche les 5 classements.

    Et j'aimerais que pour Monsieur X maintenant, que la valeur de $a, $a1, $a2, $a3, $a4 soient additionnées ... ce qui me permettrait d'effectuer le classement général sur la base des positions.

    S'il est premier au jeu 1, 5ème au jeu 2, 7ème au jeu 3, 2ème au jeu 4 et 19ème au jeu 5 que ça m'affiche monsieur X : 1+5+7+2+19 = 34
    Et après établir un nouveau classement sur ces points là

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut
    Vu ce que tu m'as dit, tu vas avoir besoin :

    1. d'une variable $nb_jeu pour savoir dans quel colonne tu recupere le score.
      C'est pas tres propre comme facon de faire. Il y a une facon plus propre et plus simple de faire qui t'aurait permis d'avoir autant de jeux que tu le souhaites sans risquer de problemes dans ton code. En utilisant un JOINTURE et un Foreign key.
    2. D'un tableau avec la liste de tes utilisateurs et leur classement ... qu'on accumulera.
    3. Trier ce tableau

    .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    <?
    $sql1 = "SELECT *  FROM `jeux`";
    $res1 = $con->sendSql($sql1);
    $nb_jeu = 1 ;
     
    echo '';
    while ($row1 = mysql_fetch_array($res1, MYSQL_ASSOC)) 
    {
      ?>
      <strong><?=stripslashes($row1["jeu1"])?></strong></br>
      <?
     
      // ici --> on mets $nb_jeu pour choisir la bonne colonne
      // /!\ si tu as plus de 5 colonnes ca va foirer ...
      //     Il y a une solution a ce probleme mais
      //     c'est peut-etre pour une autre fois
      //     tant que t'as que 5 jeux ca ira.
      //
      $sql = "      SELECT `nom`,`score".$nb_jeu."`  
                          FROM `scores` 
                   ORDER BY `score1` DESC
                ";
     
      $res = $con->sendSql($sql);
     
      $a                       = 0           ;
      $score_precedent = 'dummy' ;
     
      while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) 
      {
         // Si le score est différent du score précédent, incrementer la position
         // dans le classement 
         if ($row['score1'] != $score_precedent)  $a++ ;
     
         echo $a.' // '.stripslashes($row['nom']).'  //  '.stripslashes($row['score1']).' </br>' ;
     
         if (!isset($classement[$row['nom']])) // si on enregistre son classement pour la 1er fois
         {
            $classement[$row['nom']] = $a ;  // ex: $classement['Jean'] = 7 ;
         }
         else // si on a deja un classement pour lui on lui ajoute le classement de ce jeux
         {
           $classement[$row['nom']] =  $classement[$row['nom']] + $a ;
           // Valeur du classement avant + valeur du nouveau classement
         }
     
         //Sauvegarder le score 
         $score_precedent = $row['score1'] ;    
      }
     
     
        $nb_jeu++ ; // on passe au jeu suivant 
     
    }
    ?>
     
    // Et maintenant il faut trier le tableau
    asort($classement) ; // trie le tableau
     
    foreach ($classement as $utilisateur => $place)
     {
        echo "Utilisateur : ".$utilisateur." // Moyenne de classement : ".($place/5)." // points de classement : ".$place."<br/>" ;
    }
    Evidemment je pense avoir fait un petit peu trop. S'il te plait n'hesite pas a poser des questions si tu ne comprends pas qqch.

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/03/2006, 14h15
  2. Réponses: 27
    Dernier message: 03/02/2003, 12h27
  3. créer un noeuds avec des paramétres
    Par Toxine77 dans le forum XMLRAD
    Réponses: 5
    Dernier message: 21/01/2003, 16h11
  4. Réponses: 2
    Dernier message: 06/12/2002, 07h50
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo