Array en php

newphp -  
Enax Messages postés 203 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

17 réponses

Enax Messages postés 203 Date d'inscription   Statut Membre Dernière intervention   145
 
$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).
2
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
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.
0
newphp
 
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 ?
0
Alex
 
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); 

} 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
newphp
 
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
0
Enax Messages postés 203 Date d'inscription   Statut Membre Dernière intervention   145
 
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.
0
newphp
 
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 ?
0
Enax Messages postés 203 Date d'inscription   Statut Membre Dernière intervention   145
 
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.
0
newphp
 
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......
0
Enax Messages postés 203 Date d'inscription   Statut Membre Dernière intervention   145
 
$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...
0
Xil Messages postés 350 Date d'inscription   Statut Membre Dernière intervention   257
 
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);
0
newphp
 
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é
0
Xil Messages postés 350 Date d'inscription   Statut Membre Dernière intervention   257
 
[Voir ma réponse plus haut, j'crois qu'elle est passée inaperçue]
0
newphp
 
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...
0
Xil Messages postés 350 Date d'inscription   Statut Membre Dernière intervention   257
 
Tu peux détailler comment tu as intégré la solution ?
0
newphp
 
Désolé je débute ..tu entends quoi par intégré la solution ?
0
Xil Messages postés 350 Date d'inscription   Statut Membre Dernière intervention   257
 
Comment tu as ajouté mon code au tien ^^
0
newphp
 
// 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 ?
0
Enax Messages postés 203 Date d'inscription   Statut Membre Dernière intervention   145
 
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();
?>
0