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 associatif à deux dimensions


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 217
    Points : 113
    Points
    113
    Par défaut tableau associatif à deux dimensions
    Bonjour les pro du web !

    voici ma question :

    Est t-il possible d'avoir un tableau associatif de cette manière:

    monTab[equipe1][0]= entrée récupérée numéro 0 pour l'équipe 1 (j'entend par entrée une ligne de ma table MySQL)

    monTab[equipe1][1]=entrée récupérée numéro 1 pour l'équipe 1

    ......

    monTab[equipe1][n]=entrée récupérée numéro n pour l'équipe 1

    monTab[equipe2][0]=entrée récupérée numéro 0 pour l'équipe 2
    monTab[equipe2][1]=entrée récupérée numéro 1 pour l'équipe 2
    ...

    ...

    monTab[equipe2][n]=entrée récupérée numéro n pour l'équipe 2

    Ainsi de suite ... pour equipe3 .... equipe n.

    Merci d'avance pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Bien sûr avec autant de dimensions que tu veux à vrai dire.
    PHP permet de manipuler les tableaux très facilement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $monTab = array();
    $monTab[$equipe][0] = 'data';

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Si j'ai bien compris ta question tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $query = "SELECT equipe, resultat FROM table";
    $res = mysql_query($query);
     
    $montab = array();
    while ($row = mysql_fetch_assoc($res))
    {
    $montab[$row['equipe']][] = $row['resultat'];
    }

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 217
    Points : 113
    Points
    113
    Par défaut
    Merci pour ta reponse .

    j'ai peu être mal expliqué ma question oubien je ne comprend pas tropp ^

    Enfait, j'a un seule tableau monTab par exemple

    les lignes seront les équipes ( premier indice) et les colonnes seront les entrées( ligne récupérées dans ma base de données) .

    comme une matrice
    m[0][0]
    m[0]1[]
    m[0][2]

    m[1][0]
    m[1]1]
    m[1][2]

    m[2][0]
    m[2]1]
    m[2][2]

    sauf que les premières indices seront des noms d'équipes ( equip 1, equipe 2 .. equipe n)

    Mon problème c'est que je ne sais pas comment le faire. Le nombre d'équipe sera dynamique et je ne le connais pas d'avance. je fais le remplissage à l'interieur d'un foreach

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach($listEquipe as $equipe){
        reponse=('SELECT * FROM pilote WHERE nomEquipe=\"equipe\"');
        while($donnes=reponse->fetch()){
     
           monTab[$equipe][]=donnees['pilote'];
        }
    }
    Merci

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Mon explication plus celle d'ABCIWEB répondent à ton besoin, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    foreach ($listEquipe as $equipe) 
    {
        $sql = "SELECT * FROM pilote WHERE nomEquipe = '{$equipe}'";
        // ici tu exécutes la requête
        // $reponse = code d'exécution du sql;
        while ($donnes = $reponse->fetch())
        {
            // ici $equipe ne change pas tant que tu n'itères pas dans le foreach
            $monTab[$equipe][] = $donnees['pilote'];
        }
    }

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 217
    Points : 113
    Points
    113
    Par défaut
    Merci beaucoup les amis

    c'est resolu

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 217
    Points : 113
    Points
    113
    Par défaut
    juste une autre question :

    Pour le parcourir je fait comme en bas ?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach($monTab as $equipe){
        foreach($equipe as $element){
     
             //mes actions
        }
    }

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Presque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach($monTab as $equipe => $elements)
    {
        // $equipe   = numéro de l'équipe
        // $elements = array(cle => valeur)
    }
    C'est la base du langage, tu devrais bouquiner un peu.

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 217
    Points : 113
    Points
    113
    Par défaut
    Bonjour,
    avec cette méthode d'accès je n'y arrive pas i me dis qu'il ne connais pas les valeur ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($monTab as cle=>$element){
        code=$element['identifiant'];
    }
    message d'erreur : l'index identifiant n'est pas connu

    Je l'ai fais avec les foreach imbriqué et ça marche nickel.

    Cependant j'ai un autre problème

    Si j'ai mon tableau à deux dimension conçu comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $tabEquipeManager=array(); 
    while($donnees=$repEquipe->fetch()){
    	$tabEquipeManager[]=$donnees['nomEquipe'];
    }	
     
    foreach($tabEquipeManager as $equipe)
    {
    	$repPiloteDeEquipe=$bdd->query("SELECT*FROM equipedupilote WHERE idAnne=\"$annee\" AND(eqJan=\"$equipe\"  OR eqFev=\"$equipe\")");
    	while($donnees=$repPiloteDeEquipe->fetch()){
    		$codePilote=$donnees['codeIdentPilote'];
    		$tabAssociePiloteEquipe[$equipe][]=$codePilote;
    	}	
    }
    tabEquipeManager : contient la liste de toutes mes équipes
    tabAssociePiloteEquipe est un tableau a deux dimension qui associe pour chaque équipe un tableau contenant la liste des pilote (=joueurs) qui le forment .

    ex:
    tabAssociePiloteEquipe[equipe1][0] =Pierre;
    tabAssociePiloteEquipe[equipe1][1]=sara
    ...
    tabAssociePiloteEquipe[equipe1][n]=xxx

    tabAssociePiloteEquipe[equipe2][0]=Zidane
    tabAssociePiloteEquipe[equipe2][1]=Pierre
    ...
    tabAssociePiloteEquipe[equipe2][n]=xxx

    Maintenant si je veux faire :
    Pour chaque équipe appartenant à la liste des équipes {
        Pour tout pilote appartenant à la liste des pilotes {
            tester si le pilote fais partie de l'équipe;
        }
    }
    je n'arrive pas car je ne sais pas récupérer une ligne de mon tableau à deux dimension en connaissant juste le nom de l'équipe.

    Existe-t-il un moyen de le faire.
    Merci d'avance

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 217
    Points : 113
    Points
    113
    Par défaut recuperer une ligne d'un tableau à 2 dimensions dans une boucle
    Bonjour,
    J'ai un tableau à deux dimension rempli comme suit :
    tabEquipeManager : contient la liste de toutes mes équipes

    tabAssociePiloteEquipe est un tableau a deux dimension qui associe pour chaque équipe un tableau contenant la liste des pilote (=joueurs) qui le forment .


    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
          .....
            .....
            $tabEquipeManager=array(); 
            while($donnees=$repEquipe->fetch()){
                $tabEquipeManager[]=$donnees['nomEquipe'];
            }   
     
            foreach($tabEquipeManager as $equipe)
            {
                $repPiloteDeEquipe=$bdd->query("SELECT*FROM equipedupilote WHERE idAnne=\"$annee\" AND(eqJan=\"$equipe\"  OR eqFev=\"$equipe\")");
                while($donnees=$repPiloteDeEquipe->fetch()){
                    $codePilote=$donnees['codeIdentPilote'];
                    $tabAssociePiloteEquipe[$equipe][]=$codePilote;
                }   
            }
    Puis apres je veux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //Pour chaque equipe de la liste d'equipe
    foreach($tabEquipeManager as $equipe)
                {               
                  //pour chaque pilote de la liste de pilote
                    foreach ($tabLignePilote as $element)
                    {
                       
                        $codePilote=$element['codeIdentPilote']; //recuperation de l'identifiant du joueur
                         
                       //Chercher depuis la table tabAssociePiloteEquipe si le Pilote(joueur) appartient à l'equipe en question
                       
                                                
                    }
                }
    Cependant mon problème c'est comment lui dire chercher le pilote juste dans l'équipe ou on est actuellement dans notre boucle?


    Merci

  11. #11
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Pourrais tu poster le sql rattaché à $repEquipe (avec les colonnes et pas *).
    Idem pour SELECT*FROM equipedupilote.
    Parce que tu fais une cuisine alors qu'il devrait normalement y avoir moyen de tout faire en une passe avec une simple jonction.

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 217
    Points : 113
    Points
    113
    Par défaut
    Voici d'abord le code de la table equipedupilote:

    Code sql : 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
    CREATE TABLE `equipedupilote` (
     `codeIdentPilote` varchar(255) NOT NULL,
     `idAnne` int(11) NOT NULL,
     `eqJan` varchar(255) NOT NULL,
     `eqFev` varchar(255) NOT NULL,
     `eqMars` varchar(255) NOT NULL,
     `eqAvril` varchar(255) NOT NULL,
     `eqMai` varchar(255) NOT NULL,
     `eqJuin` varchar(255) NOT NULL,
     `eqJuil` varchar(255) NOT NULL,
     `eqAout` varchar(255) NOT NULL,
     `eqSep` varchar(255) NOT NULL,
     `eqOct` varchar(255) NOT NULL,
     `eqNov` varchar(255) NOT NULL,
     `eqDec` varchar(255) NOT NULL,
     PRIMARY KEY (`codeIdentPilote`,`idAnne`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    en prenant comme exemple le nom d'équipe =PCC et idAnne=2013
    voici le sql que j'obtiens:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT *
    FROM equipedupilote
    WHERE idAnne = '2013'
    AND (
    eqJan = 'PCC'
    OR eqFev = 'PCC'
    )
    LIMIT 0 , 30

  13. #13
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bon c'est pas gagné, le design de ta table n'est pas très bon.

    Pourquoi avoir étalé les mois sur 12 colonnes ?
    Pourquoi avoir mis partout des varchar alors que normalement tu devrais avoir des identifiants (id autonum) provenant de la table équipes ?
    Pourquoi avoir mis l'année sur 11 digits ?

  14. #14
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 217
    Points : 113
    Points
    113
    Par défaut
    Enfait,

    l'année serait normalement un idAnnee. En fait, j'ai un autre table qui contient toutes les années (2013,2014,......) avec chacune des id qui vont s'auto incrémenter.Je ne pouvez pas présenter tous le code c'est pourquoii je l'ai simplifié avant de le posté.
    Aussi concernant l'étalage j'ai pensé que c'était la façon la plus souple car les tableaux contiendront des milliers de lignes et pour éviter d'utiliser 12 lignes pour chaque entree j'ai choisit de les mettre comme ça car au moment de l'affichage ce sera en vision calendaire. Pour les varchar c'est vrai que je peut faire comme tu m'a dis.

    Donc si je comprend bien il n'y a pas moyen de recuperer une ligne d'un tableau :

    tabAssociePiloteEquipe[equipe][] puis faire mes traitement de test avec cette ligne??

  15. #15
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Tu n'aurais pas dû hésiter, 12 lignes pour chaque entrée c'est rien du tout.
    Quand bien même tu aurais 1 millions de lignes, les traitements seraient instantanés.
    Pour t'en sortir, tu vas être obligé de compliquer malheureusement les requêtes SQL et elles ne vont pas être très propres du coup.

    Pour ton problème :
    Pour chaque équipe appartenant à la liste des équipes {
        Pour tout pilote appartenant à la liste des pilotes {
            tester si le pilote fais partie de l'équipe;
        }
    }
    je ferais un peu différemment que de requêter la base de données de manière itérative : je rapatrierai toutes les données pour une année spécifique et je reconstruirai un tableau d'appartenance des membres à une équipe (corrigeant le design de la base)
    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
    <?php
     
    $qry     = $bdd->query("SELECT * FROM equipedupilote WHERE idAnne = {$annee}");
    $equipes = array();     // array[id_pilote][equipe] = true
    $row     = array();
     
    $check =
        function($p) use (&$row, &$equipes)
        {
            $k = "eq{$p}";
            if ( ! empty($row[$k]))
            {
                $equipes[$row['codeIdentPilote']][$row[$k]] = true;
            }
        };
     
    while($row = $qry->fetch())
    {
        $check('Jan');
        $check('Fev');
        $check('Mars');
        $check('Avril');
        $check('Mai');
        $check('Juin');
        $check('Juil');
        $check('Aout');
        $check('Sept');
        $check('Oct');
        $check('Nov');
        $check('Dec');
    }
     
    // ensuite pour savoir si le pilote appartient à une équipe
    if (isset($equipes['pilote_1234']['nom_equipe']))
    {
     
    }
     
    // pour avoir toutes les équipes du pilote
    $list = array_keys($equipes['pilote_1234']);
     
    ?>
    C'est le mauvais design de ta base qui pousse à ce genre de mocheté.

  16. #16
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 217
    Points : 113
    Points
    113
    Par défaut
    Merci ,

    je vais faire comme tu dis pour le moment. Apres je reverrai le design de ma base pour mieux profiter des opportunité des tableau associatifs.

    Merci encore

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

Discussions similaires

  1. Recherche dans un tableau associatif à deux dimensions
    Par General_Batton dans le forum Langage
    Réponses: 4
    Dernier message: 16/10/2014, 22h47
  2. Tableau associatif à deux dimensions
    Par Blo0d4x3 dans le forum Langage
    Réponses: 1
    Dernier message: 24/01/2009, 00h18
  3. Réponses: 6
    Dernier message: 19/11/2008, 10h53
  4. Réponses: 6
    Dernier message: 26/11/2005, 19h55
  5. Réponses: 13
    Dernier message: 13/10/2005, 16h03

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