Array en php

Fermé
newphp - 14 févr. 2008 à 12:25
Enax Messages postés 203 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 16 mars 2010 - 15 févr. 2008 à 15:00
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 lundi 11 février 2008 Statut Membre Dernière intervention 16 mars 2010 145
14 févr. 2008 à 13:19
$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 dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
14 févr. 2008 à 13:21
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
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
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
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 lundi 11 février 2008 Statut Membre Dernière intervention 16 mars 2010 145
14 févr. 2008 à 14:11
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
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 lundi 11 février 2008 Statut Membre Dernière intervention 16 mars 2010 145
14 févr. 2008 à 14:58
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
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 lundi 11 février 2008 Statut Membre Dernière intervention 16 mars 2010 145
14 févr. 2008 à 15:21
$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 vendredi 18 janvier 2008 Statut Membre Dernière intervention 11 juin 2009 257
14 févr. 2008 à 15:30
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
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 vendredi 18 janvier 2008 Statut Membre Dernière intervention 11 juin 2009 257
14 févr. 2008 à 15:32
[Voir ma réponse plus haut, j'crois qu'elle est passée inaperçue]
0
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 vendredi 18 janvier 2008 Statut Membre Dernière intervention 11 juin 2009 257
14 févr. 2008 à 15:54
Tu peux détailler comment tu as intégré la solution ?
0
Désolé je débute ..tu entends quoi par intégré la solution ?
0
Xil Messages postés 350 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 11 juin 2009 257
14 févr. 2008 à 16:04
Comment tu as ajouté mon code au tien ^^
0
// 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 lundi 11 février 2008 Statut Membre Dernière intervention 16 mars 2010 145
15 févr. 2008 à 15:00
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