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 :

remplissage d'un tableau à 2 dimensions


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 63
    Points : 58
    Points
    58
    Par défaut remplissage d'un tableau à 2 dimensions
    Bonjours,

    ce n'ai pas la première fois que je remplisse un tableau à deux dimension, mais là franchement je cède car je ne comprends pourquoi mon code le fait mal. Alors si quelqu'un est familier avec ce type d'erreur , qu'il m'aide. j'y suis planté depuis ce matin, et ça bloque l'avancement de mon application.

    je travailles avec php et je remplis mon tableau depuis une BD mysql ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while ($row_pays = mysql_fetch_array($mysqlQuery, MYSQL_ASSOC)) {
    	// Initialiser le tableau à 0 pour chaques secteur 
    	$tableauInvestsParPays[$row_pays['PAYS']]=array(0,0,0,0,0); 	
    	// Récupérer les invests par secteur du pays en cours
    	$mysqlQuery2 = @mysql_query(sprintf($sql_invests_par_secteur, $row_pays['PAYS']), $mysqlCnx) or die('second query'.mysql_error().$mysqlQuery2);
     
    	while ($row_secteur = mysql_fetch_array($mysqlQuery2, MYSQL_ASSOC)) {
    	//arraySearch(array $haystack, $value) 
    		$tableauInvestsParPays[$row_pays['PAYS']][$row_secteur['SECTEUR']] = $row_secteur['NOMBRE_PROJETS'];
     
    	}
    }
    quand j'affiche mon tableau $tableauInvestsParPays avec var_dump(), je remarque ç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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    ["Belgique"]=> array(6) { 
    	[0]=> int(0)==> 0 
    	[1]=> int(0)==> 0 
    	[2]=> int(0)==> 0 
    	[3]=> int(0)==> 0 
    	[4]=> int(0)==> 0 
    	["Tourisme"]=> string(1) "1" } 
    ["Coree du sud"]=> array(9) { 
    	[0]=> int(0)==> 0 
    	[1]=> int(0)==> 0 
    	[2]=> int(0)==> 0 
    	[3]=> int(0)==> 0 
    	[4]=> int(0)==> 0 
    	["Industrie agroalimentaire"]=> string(1) "1" 
    	["Industrie chimique et parachimique"]=> string(1) "1" 
    	["Industrie du bois,papier et carton"]=> string(1) "2" 
    	["Industrie du textile et cuir"]=> string(1) "1" }
    ["France"]=> array(8) { 
    	[0]=> int(0)==> 0 
    	[1]=> int(0)==> 0 
    	[2]=> int(0)==> 0 
    	[3]=> int(0)==> 0 
    	[4]=> int(0)==> 0 
            ["Industrie agroalimentaire"]=> string(1) "1" 
    	["Industrie du bois,papier et carton"]=> string(1) "3" 
    	["Industrie du textile et cuir"]=> string(1) "1" } 
          .
          .
          .
          .
     }
    mais ce que je doit avoir c'est plutôt ç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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    ["Belgique"]=> array(5) { 
    	["Industrie agroalimentaire" ]=> int(0)==> 0
    	["Industrie chimique et parachimique"]=> int(0)==> 0 
    	["Industrie du bois,papier et carton"]=> int(0)==> 0 
    	["Industrie du textile et cuir" ]=> int(0)==> 0 
    	["Tourisme"]=> int(1)==> 1 } 
    ["Coree du sud"]=> array(5) { 
    	["Industrie agroalimentaire" ]=> int(0)==> 1 
    	["Industrie chimique et parachimique"]=> int(0)==>1  
    	["Industrie du bois,papier et carton"]=> int(0)==>2
    	["Industrie du textile et cuir"]=> int(0)==>1
    	["Tourisme"]=> int(0)==> 0 }
    ["France"]=> array(5) { 
    	["Industrie agroalimentaire" ]=> int(1)==> 1 
    	["Industrie chimique et parachimique" ]=> int(1)==> 1 
    	["Industrie du bois,papier et carton" ]=> int(1)==> 3 
    	["Industrie du textile et cuir" ]=> int(1)==> 1 
    	["Tourisme"]=> int(1)==> 1   
     } 
          .
          .
          .
          .
     }

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2004
    Messages : 108
    Points : 175
    Points
    175
    Par défaut
    Bonjour,

    Est-ce que vous pourriez mettre la requête qui vous permet de récupérer les secteurs ?


    (Et ceci n'a rien à voir mais l'extension mysql pour php est déprécier, il vaudrait mieux utiliser celle nommé mysqli. A oublier si vous utiliser une version de php inférieur à la 5 mais si ce n'est pas le cas alors autant prendre les extensions maintenu )

  3. #3
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 63
    Points : 58
    Points
    58
    Par défaut
    je suis sous la version 5.1 de php, mais je ne sais pas quel rapport cela pourrait avoir avec cette mauvaise structure du tableau.

    C'est comme si il ajoute les éléments à la fin au lieu de chercher la clé convenable(qui est le nom du secteur) et lui attribuer la valeur correspondante (nombre_projets):

    voici ma requêtte d'extraction des secteurs:

    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
     
    //------récupérer les secteurs et nombre projets------------------
    $sql_invests_par_secteur = <<<EOF
    SELECT  
    	`secteur` AS SECTEUR, 
    	COUNT( `id_projet` ) AS NOMBRE_PROJETS
    FROM projet
    WHERE `PaysOrigine` = '%s'
    GROUP BY SECTEUR
    EOF;
    //----recupérer les pays----------------------------------------
    $sql_pays = <<<EOF
    SELECT `PaysOrigine` AS PAYS
    FROM projet
    GROUP BY PAYS
    EOF;
    //---------------
    $mysqlQuery = @mysql_query($sql_pays, $mysqlCnx) or die(mysql_error().$mysqlQuery);

  4. #4
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 63
    Points : 58
    Points
    58
    Par défaut
    waaaaaaaaaaaaaaaaaw enfin, j'ai le résultat qui me faut;

    j'ai inseré des foreach() ici et là:

    ->le premier: pour bien inicialiser le tableau;
    ->le second: pour forcer le parcours du tableau avec clé depuis le début.

    voici 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
     
    while ($row_pays = mysql_fetch_array($mysqlQuery, MYSQL_ASSOC)){
     
     		foreach($tableauSecteurs as $cle => $valeur)
     		{
    			$tableauInvestsParPays[$row_pays['PAYS']][$valeur] = 0; 
    		}
     
    	    $mysqlQuery2 = @mysql_query(sprintf($sql_invests_par_secteur, $row_pays['PAYS']), $mysqlCnx) or die('second query'.mysql_error().$mysqlQuery2);
    	while ($row_secteur = mysql_fetch_array($mysqlQuery2, MYSQL_ASSOC)) 
    	{
    		foreach($tableauInvestsParPays as $cle1 => $valeur1){
    		 foreach ($valeur1 as $cle2=>$valeur2){
    		 	if ($cle2==$row_secteur['SECTEUR']){
     
     
    		      $tableauInvestsParPays[$row_pays['PAYS']][$cle2] = intval($row_secteur['NOMBRE_PROJETS']);
          		         }
    		 }
    	        }	
    	}
    }
    Bon développement

  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
    Bonjour,

    sauf erreur de ma part, je pense que ce code est équivalent au tien (en plus lisible) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $tableauInvestsParPays = array();
    $default_values        = array_fill_keys($tableauSecteurs, 0);
     
    while ($rp = mysql_fetch_assoc($mysqlQuery))
    {
        $tableauInvestsParPays[$rp['PAYS']] = $default_values;
        $mysqlQuery2 = mysql_query(sprintf($sql_invests_par_secteur, $rp['PAYS']), $mysqlCnx) or die('second query'.mysql_error().$mysqlQuery2);
     
        while ($rs = mysql_fetch_assoc($mysqlQuery2))
        {
            $tableauInvestsParPays[$rp['PAYS']][$rs['SECTEUR']] = intval($rs['NOMBRE_PROJETS']);
        }
    }
    Je t'invite aussi à envisager de cesser d'utiliser les fonctions mysql_* (obsolètes) et de basculer sur mysqli_* ou PDO.
    Enfin, essaye de rester cohérente dans les nommages des variables : soit tu utilise le _ comme séparateur de mots, soit tu optes pour la notation camelCase. Personnellement, j'ai une préférence pour le _

  6. #6
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 63
    Points : 58
    Points
    58
    Par défaut
    ->la première partie que tu as changé m'a l'aide de faire la même chose, mais je ne peux pas le tester car la fonction array_fill_keys() est valide pour les versions >=5.2 de php; j'utilise la version 5.1.

    -> la ligne contenue dans la deuxième boucle while me donne la même mauvaise structuration qu'avant.

    Je t'invite aussi à envisager de cesser d'utiliser les fonctions mysql_* (obsolètes) et de basculer sur mysqli_* ou PDO.
    Enfin, essaye de rester cohérente dans les nommages des variables : soit tu utilise le _ comme séparateur de mots, soit tu optes pour la notation camelCase. Personnellement, j'ai une préférence pour le _
    oui tu as raison

  7. #7
    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
    Pour la deuxième partie, es-tu sûre que $row_secteur['SECTEUR'] ne renvoie que du texte ?
    Pose donc un print_t() et vérifie.
    Parce que normalement, tu n'as besoin de toutes ces boucles imbriquées pour parvenir à ton résultat.

    PHP 5.1.0 date du 24-Nov-2005 ! T'es nostalgique ?

    Pour ton sql, tu peux le reprendre un poil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql_pays = 'SELECT DISTINCT `PaysOrigine` AS PAYS FROM projet';
    Au niveau de tes données, est-ce qu'il existe des enregistrements dans la table projet avec la colonne secteur renseignée et id_projet à NULL ?

    Essaie avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $sql_invests_par_secteur = <<<EOF
    SELECT  
    	`secteur` AS SECTEUR, 
    	COUNT(*) AS NOMBRE_PROJETS
    FROM projet
    WHERE `PaysOrigine` = '%s'
    GROUP BY SECTEUR
    EOF;

  8. #8
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 63
    Points : 58
    Points
    58
    Par défaut
    je suis bien d'accord avec toi qu'il faut opter pour un code plus lisible et émerger vers les nouvelles versions des outils de travail, d'ailleurs je viens de télécharger wamp2.2(php5.4, mysql5.5) ;
    Mais, c'est parce que cette phase du remplissage du tableau n'est qu'un petit étape dans mon application que je me contente de cette solution pour le moment:

    enfait, le gros soucie je l'ai lancé dans cette discussion:
    http://www.developpez.net/forums/d13...t/#post7215595

    si tu as déjà travaillé avec JpGraph merci de me donner un coup demain.

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

Discussions similaires

  1. Remplissage séquentiel d'un tableau 2 dimensions
    Par clickandgo dans le forum Collection et Stream
    Réponses: 15
    Dernier message: 15/01/2014, 12h12
  2. [PostgreSQL] Remplissage Tableau 2 dimensions
    Par brm9160a dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/05/2010, 11h33
  3. Remplissage d'un tableau a 2 dimensions
    Par rmac2050 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 19/03/2008, 13h25
  4. Réponses: 23
    Dernier message: 21/08/2003, 07h16
  5. Réponses: 11
    Dernier message: 04/08/2003, 15h30

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