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 :

création de variables dynamiques


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut création de variables dynamiques
    Bonjour,

    Je galère sur ce truc qui est censé être assez simple...
    voila j'ai trois tableaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $array2009 = array();
    $array2010 = array();
    $array2011 = array();
    Mon soucis, c'est que je voudrais que mon script s'adapte en fonction des années à venir, je ne veux donc pas créer mes tableaux à la main.
    Pour ce qui de la récupération de l'année, j'utilise ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $year = 2009;
    for($i=$year; $i<date("Y")+1; $i++){...}
    Pour ce qui est des données présentes dans mon tableau, elle proviennent de la base de données, donc pas de soucis pour les remplir...

    Mon problème c'est : Comment générer autant de tableau que j'ai d'années ? Comment faire pour créer la variable de type $arrayMonAnnée ?

    [EDIT]FAQ Find...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for($i=0; $i<10; $i++){
        $ct_var = "nombre_" . $i;
        echo $$ct_var;
    }
    Cela ne me dit pas comment entrée des données dans mes variables...

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Plusieurs solutions sont possible, tu peux effectivement passer par les variables dynamiques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ($i=2007;$i<=date('Y');$i++) 
      ${'annee'.$i} = $i;
     
    var_dump($annee2011);
    Mais je trouve cette solution à la fois peu pratique et dangereuse, il vaut mieux utiliser des tableaux multi-dimentionnels:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $annees = array();
    for ($i=2007;$i<=date('Y');$i++) 
      $annees[$i] = $i;
     
    var_dump($annees[2011]);

  3. #3
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut
    En effet la seconde solution parait plus propre mais je ne m'en sort pas beaucoup plus...
    Voici mon 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <?php
    //création d'une table de liaison pour l'affichage en français.
    	$mois = array('1' => 'Janvier',
    				  '2' => 'Fevrier',
    				  '3' => 'Mars',
    				  '4' => 'Avril',
    				  '5' => 'Mai',
    				  '6' => 'Juin',
    				  '7' => 'Juillet',
    				  '8' => 'Aout',
    				  '9' => 'Septembre',
    				  '10' => 'Octobre',
    				  '11' => 'Novembre',
    				  '12' => 'Decembre');
     
    	$year = array();
    	for($i=2009; $i<date("Y")+1; $i++){
    		$year[$i] = $i;
    ?>
    		<table class="table" align="center">
    		<caption>Année <?php echo $i;?></caption>
    		<tr>
    			<th class='blank'>/</th>
    			<?php 
    				$q = pg_query($db,$req);
    				while($res = pg_fetch_assoc($q)){echo "<th>".$mois[$res['mois']]."</th>";}
    			?>
    			<th>
    			Total
    			</th>
    		</tr>
    		<tr align=center>
    			<th>Nb téléchargements :</th>
    			<?php
    				$q = pg_query($db,$req);
    				$count = 0;
    				$arrayCounter = 0;
    				while($res2 = pg_fetch_assoc($q))
    				{
    					echo "<td>".$res2['total']."</td>";
    					$count += $res2['total'];
    					$year[$i][$arrayCounter] = $res2['total'];
    					$arrayCounter++;
    				}
    				echo "<td class=total>".$count."</td>";
    				$year[$i][$arrayCounter] = $count;
    			?>
    		</tr>
    		</table>
    <?php } ?>
    J'espère que celui-ci est assez compréhensible...
    J'ai volontairement coupé ce qui ne sert pas (connexion DB, scripts...)
    Comme vous l'aurez sans doute compris mon but est d'afficher un tableau comprenant des statistiques... Cela fonctionne très bien, en revanche je n'arrive pas à conserver les données dans des "array" par années...
    Si vous avez une suggestion, je suis preneur !

    Un var_dump donne le résultat suivant :
    int(2009)int(2010)int(2011)

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Comme suggestions je te recommande de:
    - séparer la logique métier (le calcul des stats) de la présentation (la mise en forme HTML), le mieux serait évidement de mettre ces deux aspects dans des fichiers séparés
    - consolider toutes les donnée dans des tableaux multidimentionnels avant affichage, ce sera plus simple à manipuler
    - utiliser la syntaxe alternative de PHP pour l'affichage afin d'avoir une identation propre et de ne pas recourir à echo

    Est ce que tu peux nous décrire ce que tu cherches à faire concrêtement ?

  5. #5
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Comme suggestions je te recommande de:
    - séparer la logique métier (le calcul des stats) de la présentation (la mise en forme HTML), le mieux serait évidement de mettre ces deux aspects dans des fichiers séparés
    - consolider toutes les donnée dans des tableaux multidimentionnels avant affichage, ce sera plus simple à manipuler
    - utiliser la syntaxe alternative de PHP pour l'affichage afin d'avoir une identation propre et de ne pas recourir à echo

    Est ce que tu peux nous décrire ce que tu cherches à faire concrêtement ?
    Je prend note, il s'agit de mon premier projet php, j'ai donc pas encore les bon réflexes.
    Voici ce que j'ai actuellement :

    Il s'agit d'une page dynamique qui me permet d'afficher quelques statistiques depuis ma BDD.
    Je souhaiterais ajouter des graphiques à cette page.
    Pour cela j'utilise le script Highcharts-2.1.6. Mon problème c'est d'arriver à injecter les valeur de ma bdd dans le script.
    C'est pour cela que je pensais passer par un tableau pour enregistrer toutes mes valeurs et les donner en paramètre à mon script ensuite.

    Ce n'est pas être pas la meilleure façon...

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Je vois.

    J'imagine que l'un des problèmes est d'avoir tous les mois dans les tables non ?
    Ce problème peut être résolu en fabriquant des structures (array) préremplies avec des compeurs à 0 et les remplir avec les données en provenance de la BDD, ainsi tu verra bien apparaitre tous les mois calendaires sur ton interface.

    Pour ce qui est de HighChart je ne l'utilise pas mais à moins que tu n'aies aquis la licence, j'espère que ton projet est "non-profit": http://www.highcharts.com/license
    Sinon, il y a d'autres solutions plus ouvertes:
    - http://g.raphaeljs.com/
    - http://pchart.sourceforge.net/
    A toi de voir.

    Pour passer les paramètres à ton script, tu peux effectivement extraire ces données du tableau (certaines librairies de graphiques en sont nativement capables d'ailleurs) ou alors tu peux utiliser l'astuce des JSon Data Island: http://www.phpied.com/json-data-island/

  7. #7
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Je vois.

    J'imagine que l'un des problèmes est d'avoir tous les mois dans les tables non ?
    Pas vraiment fait. Je n'ai pas besoin de tous les mois, uniquement ceux pour lesquels j'ai des données dans ma base. Si un mois est "vide", je n'ai pas besoin de l'afficher...
    Citation Envoyé par Benjamin Delespierre Voir le message
    Ce problème peut être résolu en fabriquant des structures (array) préremplies avec des compeurs à 0 et les remplir avec les données en provenance de la BDD, ainsi tu verra bien apparaitre tous les mois calendaires sur ton interface.
    En fait mon problème est d'arriver à remplir ces "array".
    Comment dois-je procédé ? Un seul ou multiple array ?
    Il faut que la structure de mes graphiques reprennent les tendances actuelles...
    A savoir regroupé par mois et par années. C'est là que je galère !

  8. #8
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut
    Bon je pense avoir trouvé la solution à mon problème.
    Voici comment je procède :
    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
     
    for($i=$year;$i<date("Y")+1; $i++)
    {
    	$req = "SELECT ...";
     
    	$q = pg_query($db,$req);
    	if (!$q) 
    	{
    		echo "Une erreur s'est produite : Requete.\n";
    		die("Error in SQL query: " . pg_last_error());
    		exit;
    	}
    	$count = 0;
    	while($res = pg_fetch_assoc($q))
    	{
    		$datas[$i][$mois[$res['mois']]] = array($res['total'],format_bytes($res['size']),format_bytes($res['datas']));
    		$count += $res['total'];
    	}
    	$totaux[$i] = $count;
    }
    Voici le résultat obtenu :
    2011 :
    Juin :
    0 = 828
    1 = 404.67 MB
    2 = 12.34 GB
    Juillet :
    0 = 866
    1 = 15.04 MB
    2 = 210.53 MB
    Aout :
    0 = 1778
    1 = 19.98 GB
    2 = 104.3 GB
    Septembre :
    0 = 650
    1 = 5.05 GB
    2 = 19.28 GB
    Merci pour la piste !
    Il me reste plus quà essayer de mettre tout ces résultats en forme...

    Je vais cherche un peux, je vous tiens au courant.

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    A ce niveau tu y es presque, il te suffit de faire 2 foreach imbriqués pour construire tes tableaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php foreach ($totaux as $year => $data): ?>
    <table id="y<?=$year?>">
      <tbody>
      <?php foreach ($data as $month => $subdata): ?>
        <tr>
           <td><?=$subdata[0]?></td>
           <td><?=$subdata[1]?></td>
           <td><?=$subdata[2]?></td>
        </tr>
      <?php endforeach ?>
      </tbody>
    </table>
    <?php endforeach ?>

  10. #10
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    A ce niveau tu y es presque, il te suffit de faire 2 foreach imbriqués pour construire tes tableaux:
    Oui mais non...
    En fait le problème c'est que je souhaites que mes données soient affichées sous cette forme :
    | Janvier | Fevrier |...
    | subdata|subdata|...
    Hors la solution proposé est de la forme :
    | Janvier | subdata |...
    | Février | subdata |...
    Pas de soucis, j'ai contourné le problème, en sortant mes boucles :
    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
     
    function afficher_mois($tableau)  
    { 
    	foreach ($tableau as $cle=>$valeur)  
    	{ 
        	echo '<th>'.$cle.'</th>';  
        } 
    	echo '<th>Total</tr>';
    }
    function afficher_dl($tableau)  
    {
    	foreach ($tableau as $cle=>$valeur)  
       	{
    		echo '<td>'.$valeur[0].'</td>'; 
    		$total +=$valeur[0];
    	}
    	echo '<td>'.$total.'</tr>';
    }
    function afficher_poids($tableau)  
    {
    	foreach ($tableau as $cle=>$valeur)  
       	{
    		echo '<td>'.$valeur[1].'</td>';   
    		$total +=$valeur[1];
    	}
    	echo '<td>'.$total.'</tr>';
    }
    function afficher_bp($tableau)  
    {
    	foreach ($tableau as $cle=>$valeur)  
       	{
    		echo '<td>'.$valeur[2].'</td>';   
    		$total +=$valeur[2];
    	}
    	echo '<td>'.$total.'</tr>';
    }
    Ensuite reste plus qu'à afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    echo '<table class="table" align="center"><caption>'.$i.'</caption><tr>';
    	afficher_mois($datas[$i]);
    	echo $ROW;
    	afficher_dl($datas[$i]);
    	echo $ROW;
    	afficher_poids($datas[$i]);
    	echo $ROW;
    	afficher_bp($datas[$i]);
    	echo $ROW;
    Résultat obtenu parfait.
    Il me reste maintenant à mettre transmettre le tout au JS...
    En tout cas, cela règle mon problème !
    Merci pour cette aide.

    PS: Promis j'essayerais d'améliorer le code pour que ce soit plus propre...

  11. #11
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Si ça peut t'aider, voici un algo pondu en 5 minutes pour "renverser" un tableau (mettre les colonnes en lignes).

    ça te sera sûrement utile

    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
    $a = array(
      array(1,2,3),
      array(4,5,6,7),
      array(8,9),
    );
     
    function array_turn (array $arr) {
      $cs = array();
      foreach ($arr as $sarr)
        $cs[] = count($sarr);
     
      $c = max($cs);
      $r = array();
      for ($i = 0; $i<$c; $i++) {
         $r[$i] = array();
         foreach ($arr as $sarr) {
           if (isset($sarr[$i])) $r[$i][] = $sarr[$i];
         }
      }
     
      return $r;
    }
    echo "<pre>";
    var_dump(array_turn($a));
    echo "<pre>";
    Note: il est possible de faire quelque chose de plus puissant avec les closures et PHP 5.3, le code ci-dessus à été testé pour PHP 5.1.

  12. #12
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Points : 5 347
    Points
    5 347
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    ça te sera sûrement utile
    En effet.
    Merci pour cet algo.
    Il va vraiment valoir que je me penche plus sur cette techno.

  13. #13
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Arf, une bonne boucle bien moche qui manipule des tableaux, on peut difficilement parler de "techno"
    Là, ça ressemble à peu près à un algo qu'on pourrait faire en C

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

Discussions similaires

  1. [MySQL] création de colonne dynamique via une variable php
    Par xKryckx dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 09/04/2015, 18h47
  2. [WD14] Création de nom de variables dynamiquement
    Par fhmayn dans le forum WinDev
    Réponses: 3
    Dernier message: 12/02/2010, 17h02
  3. Création de variable dynamique
    Par netsliver dans le forum C++Builder
    Réponses: 1
    Dernier message: 02/08/2006, 18h48
  4. Récupération de variables dynamiques complexes
    Par ludoboy dans le forum ASP
    Réponses: 7
    Dernier message: 24/05/2004, 17h51
  5. [LG]Problême Variable dynamique de types différents
    Par pierrOPSG dans le forum Langage
    Réponses: 2
    Dernier message: 29/04/2004, 16h01

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