Array en php

Bonjour,

J'ai une boucle while et je lis des données (dans une boucle for) qui sont stockées dans un fichier excel :
for($i=1;$i<=3;$i++)
{

echo $data[$i];
echo "<br/>";
}
Cela me donne $data[1]=19 ; $data[2]=42; $data[3]=15
Comment faire pour que cela revienne a : array(19, 42, 15) ??

Je me sers de la librairie graphique artichow (pour faire des graphiques) et il faut cette syntaxe :
// Les valeurs à afficher sur l'histogramme
$values = array(19, 42, 15, -25, 3);
// On créé l'histogramme
$plot = new BarPlot($values);

Si je ne suis pas assez explicite faite le moi savoir

17 réponses

  1. $data est un array puisque tu as [1], [2]... Tu peux utiliser print_r($data) pour afficher ces valeurs. Du coup tu peux faire directement $plot = new BarPlot($data).
    1. Je ne comprend pas, tu l'as déja ton array c'est $data

      en faisant echo $data[$i] tu ne fais que lire ce qu'il y dedans, ça ne l'efface pas.
      1. En fait si je fais:
        for($i=1;$i<=3;$i++)
        {

        // $values = array(12, 8, 20, 32, 15, 5);

        $plot = new BarPlot($data,);

        // Une fois le premier histogramme créé et personnalisé, il faut l'ajouter au groupe, de cette manière :
        $group->add($plot);

        }

        Cela m'affiche ce message d'erreur: Class Plot:Expected numeric values for the plot

        Quelqu'un voit comment corriger ce problème svp ?
        1. Regarde la ligne 6 qui a été modifiée

          for($i=1;$i<=3;$i++) 
          { 
          
          // $values = array(12, 8, 20, 32, 15, 5); 
          
          $plot = new BarPlot($data[i]); 
          
          // Une fois le premier histogramme créé et personnalisé, il faut l'ajouter au groupe, de cette manière : 
          $group->add($plot); 
          
          } 
          1. J'ai fais ta modif, par contre j'ai un autre message d'erreur:
            Class Plot: you tried to set a value that is not an array

            Une autre solution?merci pour ta réponse en tout cas
            1. Il vient d'où en fait ton $data ?

              Et-tu sûr qu'il contient des valeurs numériques ? Vérifies avec :
              <?php
              	foreach($data as $v)
              	{
              		if(is_numeric($v))
              			echo 'valeur numérique<br />';
              		else
              			echo 'valeur non numérique<br />';
              	}
              ?>


              Et c'est $plot = new BarPlot($data); Tu avais mis une virgule après $data.
              1. Merci pour ton aide,
                Oui j'avais su pour la virgule.
                Donc j'ai fais le test, et toute mes valeurs sont numérique. En fait j'ai comme valeur:
                16.67 12 16.67 33.33 55.56 11.11

                Tu n'aurai pas une autre idée par hasard ?
                1. Est-ce que la boucle sert à quelque chose, càd as-tu plusieurs séries de nombre ou une seule ? Si tu en as bel et bien plusieurs, essaie avec une seule pour commencer. A partir du moment où $data est bien un array numérique, il ne devrait alors pas il y avoir de problème.
                  1. J'ai enlevé ma boucle for.
                    A la place j'ai mis : $plot = new BarPlot($data[2]);

                    J'ai testé avec $data[1] et 3 ....

                    J'ai encore excepted numeric values for the plot..
                    Je ne vois pas trop comment faire......
                    1. $data est un array.
                      $data[x] est une valeur.
                      On te demande un array.
                      Donc : $plot = new BarPlot($data);

                      Utilises ce code (en changeant le chemin d'artichow) :
                      <?php
                      	require_once "chemin_artichow/BarPlot.class.php";
                      	$graph = new Graph(200, 200);
                      	$group = new PlotGroup;
                      	$plot = new BarPlot($data);
                      	$group->add($plot);
                      	$graph->add($group);
                      	$graph->draw();
                      ?>


                      M'enfin, si tu n'arrives déjà pas à faire ça, tu vas galérer pour utiliser pleinement artichow...
                      1. Le constructeur de BarPlot prend un tableau (array) comme argument.
                        Dans ton cas, $data[$i] n'est pas un tableau mais UNE valeur numérique de ce tableau.
                        Il faut utiliser simplement $plot = new BarPlot($data); , et pas dans une boucle.
                        [Ouned by Enax ! J'suis trop lent au boulot]

                        Par contre, puisque tes valeurs viennent d'un tableau Excel, il est possible que les nombre à virgule soient considérés comme des chaînes de caractères. Pour une bonne compatibilité, je te conseille de rajouter ceci :
                        foreach($data as &$number) {
                          $number = floatval($number);
                        }
                        $plot = new BarPlot($data);
                        
                        1. J'avais déjà fais auparavant un test sur artichow
                          Quand je fais un graphique en prenant des données dans ma bdd, cela marche nickel
                          Mais par contre je n'arrive pas à afficher quand je prends les données via mon fichier excel...se matin j'étais arrivé à afficher la premiére ligne mais pas les duexiémes
                          J'ai posté un message dans le forum d'artichow mais toujours pas de réponses
                          Voici mon message, peut étre que toi tu saura me répondre.
                          ---------------------------------------------------------------------------------------------
                          bonjour,
                          je voudrais lire les données stockées dans mon csv et ensuite les afficher dans un histogramme.
                          Mon fichier csv a cette "bouille":

                          Nom question TotalOui TotalNon TotalOSF
                          Sa va ? 4 2 3
                          Tu bosse ? 7 1 2

                          En gros c'est sa....

                          Voici mon code, le problème c'est qu'il ne m'affiche que l'histogramme de la ligne Sa va?. Comment faire pour que cela m'affiche aussi les résultats de Tu bosse ?

                          // Lecture du fichier contenant les questions et divers enregistrement :
                          if (!$fp = fopen("fichier.csv","r"))
                          {
                          echo "Echec de l'ouverture du fichier";
                          exit;
                          }
                          else
                          {
                          // Permet d'éviter de lire la première ligne contenant les questions :
                          $premierCoup=0;
                          require_once "Artichow/BarPlot.class.php";
                          
                          $graph = new Graph(400, 400);
                          $graph->setAntiAliasing(TRUE);
                          
                          
                          while (($data = fgetcsv($fp, 1000, ";")) !== FALSE)
                          {
                          // Test pour éviter de lire les preiméres colonnes contenant:TotalOUI, TotalNon, TotalOSF:
                          if($premierCoup==0)
                          {
                          // On ne fait rien: on passe $premierCoup a faux, comme cela au prochain coup on rentrera dedans :
                          $premierCoup=1;
                          
                          }
                          // On lit les autres lignes contenant les pourcentages:
                          else
                          {
                          //echo "toto";
                          $values = array($data[1], $data[2], $data[3]);
                          $plot = new BarPlot($values);
                          $plot->setBarColor(new Color(250, 230, 180));
                          $plot->setSpace(5, 5, NULL, NULL);
                          
                          $plot->barShadow->setSize(3);
                          // $plot->barShadow->setPosition(Shadow::RIGHT_TOP);
                          $plot->barShadow->setColor(new Color(180, 180, 180, 10));
                          $plot->barShadow->smooth(TRUE);
                          /*$days = array(
                          'NB OUI',
                          'NB NON',
                          'Nb OSF',
                          
                          );
                          $plot->xAxis->setLabelText($days);*/
                          
                          
                          $graph->add($plot);
                          $graph->draw();
                          
                          }
                          
                          }
                          }
                          
                          
                          
                          


                          Merci pour les courageux qui se plongerons dans le code...

                          ----------------------------------------------------------------------------------------------------
                          Si tu veux bien m'aider je suis preneur, en tout cas merci du temps que tu ma consacré
                          1. désolé je n'avais pas vu ta réponse Xil ....
                            Dans mon fichier csv, j'ai enlevé toutes les virgules, je n'est mis que des nombre ronds.
                            J'ai donc testé ta méthode, bon bin cela n'a rien changé....merci quand même
                            Mais bon je ne désespère pas pour autant...
                            1. Tu peux détailler comment tu as intégré la solution ?
                          2. Désolé je débute ..tu entends quoi par intégré la solution ?
                            1. Comment tu as ajouté mon code au tien ^^
                          3. // On lit les autres lignes contenant les pourcentages:
                            else
                            {
                            //echo "toto";
                            //$values = array($data[1], $data[2], $data[3]);
                            $plot = new BarPlot($data);
                            $plot->setBarColor(new Color(250, 230, 180));
                            $plot->setSpace(5, 5, NULL, NULL);
                            
                            $plot->barShadow->setSize(3);
                            // $plot->barShadow->setPosition(Shadow::RIGHT_TOP);
                            $plot->barShadow->setColor(new Color(180, 180, 180, 10));
                            $plot->barShadow->smooth(TRUE);
                            /*$days = array(
                            'NB OUI',
                            'NB NON',
                            'Nb OSF',
                            
                            );
                            $plot->xAxis->setLabelText($days);*/
                            
                            
                            $graph->add($plot);
                            $graph->draw();
                            
                            }


                            Comme je n'ai pas de virgule dans mes nombres, je n'est pas utilisé :foreach($data as &$number) {
                            $number = floatval($number);
                            }

                            C'était cela que tu conté faire ?
                            1. Voilà un code qui marche très bien chez moi pour un fichier csv de ce type :
                              chaîne | chaîne | chaîne | chaîne |
                              chaîne | nombre | nombre | nombre |
                              chaîne | nombre | nombre | nombre |
                              chaîne | nombre | nombre | nombre |
                              chaîne | nombre | nombre | nombre |
                              ...
                              

                              Code :
                              <?php
                              	require_once "chemin_artichow/BarPlot.class.php";
                              	$graph = new Graph(400, 400);
                              	$group = new PlotGroup;
                              	$fp = fopen("test.csv","r");
                              	$premierCoup = 0;
                              	while (($data = fgetcsv($fp, 1000, ",")) !== FALSE)
                              	{
                              		if($premierCoup == 0)
                              			$premierCoup = 1;
                              		else
                              		{
                              			$values = array($data[1], $data[2], $data[3]);
                              			$plot = new BarPlot($values);
                              			$group->add($plot);
                              		}
                              	}
                              	$graph->add($group);
                              	$graph->draw();
                              ?>