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

Langage PHP Discussion :

Tableau à l'horizontal (Nom sans doublon); Semaine; TSI [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Par défaut Tableau à l'horizontal (Nom sans doublon); Semaine; TSI
    Bonjour à vous tous,

    Je suis partie d'une vieille discussion de 2006 intitulé "[html PHP] Affichage des résultats à l'horizontal"

    Je débute et je m'adresse à vous car je rencontre des difficultés pour concevoir un tableau que je crée à partir de données d'une base sql.
    Ci joint, une image du tableau que j'ai fait sous Excel (Sans titre-2.png).
    C'est un peu compliqué à expliquer mais voilà, j'ai dans ma base de donnée une liste de joueurs de foot et pour chacun d'eux un nouveau TSI (Note de performance) toutes les semaines.
    Je vous joint le fichier table_hattrick_2(1).sql pour que vous vous rendez compte de la difficulté.

    J’aimerais faire un tableau horizontal avec:
    Dans les colonnes, les notes obtenues à chaque semaine (Colonne1) et une ligne pour chaque joueur (Nom)

    J'arrive à faire un tableau mais le problème c'est qu'il liste le nom du joueur pour chaque note et à la vertical comme ceci:

    Colonne1 Nom TSI
    1 Laurent Barel 1330
    2 Laurent Barel 2510
    3 Laurent Barel 2110
    4 Laurent Barel 2500
    5 Laurent Barel 2980
    6 Laurent Barel 3430
    7 Laurent Barel 4140
    8 Laurent Barel 4780
    9 Laurent Barel 4930
    10 Laurent Barel 5060
    11 Laurent Barel 5520
    12 Laurent Barel 6010
    13 Laurent Barel 5820
    14 Laurent Barel 7420
    15 Laurent Barel 8170
    16 Laurent Barel 8790
    17 Laurent Barel 9410
    1 Ludovic Fourny 590
    2 Ludovic Fourny 720
    3 Ludovic Fourny 770
    4 Ludovic Fourny 810
    5 Ludovic Fourny 850
    .....

    J'aimerais obtenir ceci:

    Listé les noms (sans doublon) dans la ère colonne Nom/TSI
    Listé les semaines dans la 1ère ligne Nom/TSI
    et complété le tableau avec les TSI de chaque Nom pour les différentes semaine

    Nom/TSI 1 2 3 4 5 6 7 8 9 10 11
    Laurent Barel 1330 2510 2110 2500 2980 3430 4140 4780
    Ludovic Fourny 590 720 770 810 850 et ainsi de suite
    Nom
    Nom

    Je vous joins le fichier de ce que j'ai déjà réussi à faire(Ma première page.html).
    j'ai fait un graphique des TSI d'un joueur, lister les semaines et le TSI correspondant et un tableau listant les Joueurs.
    J'aimerais maintenant faire un tableau horizontal avec ces différentes données.
    Si ce type de tableaux est réalisable, pouvez-vous m'aider à le réaliser en me donnant la marche à suivre, des exemples de code?
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Le support de la version 5.2 de PHP s'est arrêté le 6 Janvier 2011. Donc avant toute chose, passe à la version 7.4. (Idem pour MySQL qui s'il a été installé en même temps doit en être à la version 5.1 qui n'est plus supportée depuis Décembre 2013. Dans ce cas passe à la version 8.0).

    Ensuite, le problème que tu cherches à résoudre pourrait se traiter coté PHP certes, mais ce n'est pas la bonne manière de faire. Tu peux en effet obtenir ce résultat directement avec la bonne requête SQL (avec MySQL à jour):
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Nom, JSON_ARRAYAGG(TSI) as TSI_List
    FROM table_hattrick_2
    GROUP BY Nom;



    Cela dit, je te conseille de suivre des tutoriels sur la conception des bases de données (et en particulier sur les formes normales), car actuellement tu l'utilises comme un tableur. N'hésite pas, il y a de quoi faire sur ce site.

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Tu as les bonnes données pour créer ton tableaux.
    Il faut juste que dans ta logique de construction de tableau tu fasse la chose suivante :

    Pour toutes mes données
    Si nouveau joueur ou premier jouer alors création d'une ligne
    Sinon création d'une colonne

    Ce qui en code se traduirais par quelque chose comme :

    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
     
    $table = '<table>';
    $lastPlayer = null;
     
    foreach($datas as $joueur) {
    	if($lastPlayer == null || $lastPlayer != $joueur['nom']) {
    		// Création d'une nouvelle ligne
    		if($lastPlayer != null) {
    			$table .= '</tr>'; // Si pas le premier joueur , on ferme la ligne précédente
    		}
    		$table .= '<tr><td>'.$joueur['nom'].'</td>';
    	}
     
    	$table .= '<td>'.$joueur['score'].'</td>';
    	$lastPlayer = $joueur['nom'];
    }
     
    $table .= '</tr></table>';
     
    echo $table;
    Par contre dans l'idéal il faudrait avoir un identifiant par joueur plutot que de comparer leur nom car ca va générer des problèmes en cas d'homonymie.
    Evidemment tout ca ne marche que si tout le monde à le même nombre de données par semaine. Sinon il faudra normaliser le tableaux avant.

    --edit--

    Merci Cosmoknacki j'aurais appris un truc avec JSON_ARRAYAGG ajourd'hui !
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Par défaut
    OUAHHHH !!!! Alors là, je suis impressionné par vos connaissances.
    J'ai lu attentivement votre réponse et effectivement, je n'étais pas du tout sur cette logique.
    Vous m'avez fait avancé d'un grand pas en un échange. un grand MERCI !!!
    J'ai repris votre code que je l'ai adapté à mes besoins.
    ça n'a pas marché du premier coup et là, un dernier coup de F5 et TADAAAAAA, un tableau comme je vous l'avez indiqué.
    Voici mon code adapté:

    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
    <?php
    $req = $bdd->query('SELECT Colonne1, Nom, TSI FROM `table_hattrick_2` WHERE TSI');
    $table = '<table_hattrick_2>';
    $lastPlayer = null;
     
    foreach($req as $joueur) {
        if($lastPlayer == null || $lastPlayer != $joueur['Nom']) {
            // Création d'une nouvelle ligne
            if($lastPlayer != null) {
                $table .= '</tr>'; // Si pas le premier joueur , on ferme la ligne précédente
            }
            $table .= '<tr><td>'.$joueur['Nom'].'</td>';
        }
        $table .= '<td>'.$joueur['TSI'].'</td>';
        $lastPlayer = $joueur['Nom'];
    }
    $table .= '</tr></table>';
    echo $table;
    ?>
    J'ai une question, dois-je suivre la même logique pour faire les entêtes du tableau qui se composes ainsi:

    NON/TSI 1 2 3 4 5 6 7 8 9 ...........

    Je vous joins en pièce joint le résultat déjà obtenu (Test_5.inc.php.html)

    Sinon, pour répondre aux autres interrogations, je suis bien avec les bonnes versions, c'est juste une erreur de ma pars.
    Concernant les homonymies, dans le jeu Hattrick, il ne peut pas en avoir.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre averti
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Par défaut
    Ah, une dernière chose, j'ai remarqué que les TSI pour les joueurs arrivés en cours de saison ne sont pas dans les bonnes colonnes.
    Exemple avec Gerald Schweiger qui a trois notes qui se trouve dans les premières colonnes au lieu d'être dans les colonnes 15; 16 et 17.

  6. #6
    Membre averti
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2016
    Messages : 20
    Par défaut Tableau à l'horizontal (Nom sans doublon); Semaine; TSI
    Bonjour,

    Je poste mes avancements sur la création du tableau.
    J'ai réussi à créer l'entête du tableau avec les numéros de semaine. (voir pièce jointe)
    et le code:
    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
     
    <!DOCTYPE html>  
    <table id="table1" class="table table-bordered">
    <br>
            <tr>
            <th><p class="text-error">Non/TSI</p></th>
    <?php
    $req = $bdd->query('SELECT DISTINCT Colonne1 FROM table_hattrick_2 where Colonne1');
    $table = '<table_hattrick_2>';
    $lastColonne1 = null;
     
    foreach($req as $Colonne1) {
        if($lastColonne1 == null || $lastColonne1 != $Colonne1['Colonne1']) {
            // Création d'une nouvelle cellule
            $table .= '<td>'.$Colonne1['Colonne1'].'</td>';
        }
    }
    //$table .= '</tr></table>';
    echo $table;
    ?>
    <?php
    $req = $bdd->query('SELECT Colonne1, Nom, TSI FROM `table_hattrick_2` WHERE TSI');
    $table = '<table_hattrick_2>';
    $lastPlayer = null;
     
    foreach($req as $joueur) {
        if($lastPlayer == null || $lastPlayer != $joueur['Nom']) {
            // Création d'une nouvelle ligne
            if($lastPlayer != null) {
                $table .= '</tr>'; // Si pas le premier joueur , on ferme la ligne précédente
            }
            $table .= '<tr><td>'.$joueur['Nom'].'</td>';
        }
     
        $table .= '<td>'.$joueur['TSI'].'</td>';
        $lastPlayer = $joueur['Nom'];
    }
    $table .= '</tr></table>';
    echo $table;
    ?>
    Par contre, je ne trouve pas le moyen de gérer le décalage des TSI pour les joueurs arrivés en cours de saison.
    Ils sont trois => Gerald Schweiger; Juan David Carvajalino; Rodrigo Falcón et Roman Nawrot
    Leurs TSI devraient être en bout de ligne comme sur le tableau posté dans mon premier message.

    Avez-vous une solution pour gérer ce décalage?
    Merci encore pour votre aide.
    Fichiers attachés Fichiers attachés

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    As tu essayé la solution proposée par CosmoKnacki ? Elle te permettrait peut être de gérer plus facilement cette problématique de décalage.

    Sinon avec ta solution actuelle , il faut retraiter le tableaux extrait de ta base avant de construire le tableau html.

    Tu fais une première requete pour connaitre le nombre max de semaine,
    Puis pour chaque joueur du tableau tu vérifies si il à une donnée pour cette semaine et si ce n'est pas le cas tu lui ajoute 0 (par exemple).

    Y'a peut être moyen de le faire en SQL directement mais je sais pas faire.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    La requête que j'ai proposée rencontre le même problème de décalage.

    Je voudrais pas être oiseau de mauvaise augure, ni entamer ton enthousiasme, mais en l'état actuel des choses, je pense qu'il est inutile de s'acharner tant que tu ne te seras pas pencher sérieusement sur la modélisation de bases de données relationnelles car là c'est la cata et pour plein de raisons. Même si tu arrives à résoudre ton problème actuel avec PHP, au prochain truc que tu essayeras de faire, la situation risque d'être tout aussi cauchemardesque (voir pire).

    Je fais des tentatives de mon coté pour donner une nouvelle forme à cette base, mais j'avoue que je galère notamment à cause des noms de colonnes qui ne veulent rien dire (`Colonne1`, `Colonne2`) ou qui ne m'évoquent rien (`TSI`, `En vente`, `Jours` ou `Semaines au club`, je ne suis pas footeux). Pourrais-tu les expliquer précisément? Comment décrirais-tu ta base de données, son objectif?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/05/2016, 17h30
  2. tableau de valeurs sans doublons à arrondis
    Par fraid49 dans le forum Général Python
    Réponses: 6
    Dernier message: 15/10/2009, 09h19
  3. filtre colonnes non contigues, sans doublons
    Par JYL74 dans le forum Excel
    Réponses: 5
    Dernier message: 14/11/2008, 10h57
  4. Tableau sans doublons
    Par raph707 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 19/02/2007, 14h59
  5. remplir un tableau sans doublons ...
    Par ryo-san dans le forum C
    Réponses: 22
    Dernier message: 10/11/2005, 12h43

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