[php] contrôler la création d'un array - problème de correspondances de dates

Bon le titre est vraiment pas clair, mais ca reflete bien ma gallère car j’y comprends rien ^^

Bon j’utilise jpgraph pour faire des graphiques, jusque là rien d’extraordinaire :slight_smile:

Je fais un histogramme genre le nombre d’articles par mois pour 2005… donc select count… group by mois, ok no soucy :slight_smile:

SAUF QUE

J’ai pas forcément des datas tous les mois…

OR

pour jpgraph faut fournir un truc qui ressemble à :

$datay = array(10,23,54,32,12);

Et donc du coup dans le déroulement du script là j’ai donné que des data jusqu’en mai, alors que ca pouvait être janvier, février, avril, juin, septembre…

J’ai tenté de faire :

$query ="blablabla" // trop long à taper, peu importe ^^
$datay = array();
while ( $tableau = mysql_fetch_array($requeteID) )
{
  $datay = array($tableau['lotMonth'] => $tableau['nombreVehicules']); // Clairement c'est foireux ce truc je pense :D :ane:
  $totalVehicules += $tableau['nombreVehicules'];
}

Si qqn a une idée ?

bon donc en fait je crois que le plus simple ca serait de retourner 0 quand j’ai pas de valeur… mais alors comment faire ca ?

mon array serait alors fait ainsi :

$datay = array(1,0,0,0,0,5,6,4,3,0,0,0);

concrêtement je veux les valeurs de 1 (janvier) à 12 (décembre), je vais quand même pas faire une boucle for $i et répéter 12 fois ma requête SQL sur un mois à chaque fois ?

C’est ultra crade comme méthode non ?

Bon en effet ca marche comme ca, mais bon je pense qu’il y a plus clean quand même :

for ($i=1; $i<13; $i++)
{
  $query ="SELECT SUM(nombreVehicules) AS nombreVehicules, DATE_FORMAT(DateLot, '%m') AS lotMonth FROM reporting WHERE DateLot Between '2005-$i-01' AND '2005-$i-31' GROUP BY lotMonth";
  $requeteID = mysql_query($query);
  $data = mysql_fetch_array($requeteID);
  $datay() = $data['nombreVehicules'];
}

Déjà
http://dev.mysql.com/doc/refman/5.0/en/dat…-functions.html

mysql> SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03');
       -> 199907

:o

Il extrait year, ou month, ou les deux c’est ca ?

Ok je note, mais c’est pas exactement ca mon problème principal en fait là ^^

Ben en même temps tu veux faire une boucle qui va de 1 a 12, je vois pas pourquoi on compliquerais la chose que de faire une boucle qui va de 1 à 12 ^^
Alors ouais c’est sur tu aurais put mettre le nombre de mois en paramètres, ou le mois de départ, mais bon c’est un peu du superflu :smiley:

Ben en fais je me demandais si il existait un moyen d’attribuer 0 quand j’ai pas de valeur, mais bon si tu me dis que ca fonctionne bien ainsi, alors dans ce cas je ownz et ca me suffira :smiley:

Plus sérieusement rapide question : c’est mieux de faire $i <= 12 ou $i<13 ? est ce qu’il ne boucle pas un coup supplémentaire dans le second cas pour vérifier si la condition est vraie ou pas ?

mais quel horreur ce code ! requete dans un for c’est à eviter.
T’as besoin d’UNE SEULE requete, tu fais un groupage par mois et ton me refait ce WHERE (pas difficile hein), ton select te retourne
1/ le mois
2/ le cumul pour le mois
(en gros tu ajoute ton lotMonth dans ton select)

et c’est la que tu fais la boucle de 1 à 12 pour determiner les mois ou faut mettre un 0

C’est bien ce que j’ai dit, tu m’apprends rien là : c’est pas propre…

En l’état la requête donne ca (du 2005-01-01 au 2005-12-31) :

monthVIN - monthLot
164 - 07
120 - 08
220 - 09
43 - 10
73 - 11

Mais jpgraph attend toujours : array(0,0,0,0,0,0,164,120,220,43,73,0);

Et je dois aussi faire le total du tout (sum array() ? :D) ^^

si t’es inspiré par du code je t’en pries je ne demande pas mieux… j’ai fait mon max je sais pas comment faire plus, sinon je l’aurais fait :slight_smile:

Ben quelque chose du genre (je ne sais pas si ca marche) :


SELECT SUM(nombreVehicules) AS nombreVehicules, DATE_FORMAT(DateLot, '%m') AS lotMonth FROM reporting WHERE EXTRACT(YEAR FROM DateLot) = 2005 GROUP BY lotMonth ORDER BY lotMonth ASC

Ensuite tu parcours la requètes pour mettre dans ton tableau les bonnes valeurs :o

Exemple :


$tableau = array(0,0,0,0,0,0,0,0,0,0,0,0);
$requete = "
SELECT SUM(nombreVehicules) AS nombreVehicules, DATE_FORMAT(DateLot, '%m') AS lotMonth FROM reporting WHERE EXTRACT(YEAR FROM DateLot) = 2005 GROUP BY lotMonth ORDER BY lotMonth ASC";
$req = mysql_query($requete);
while($row = mysql_fetch_array($req))
{
$tableau[($row['lotMonth'] - 1)] = nombreVehicules;
}

Ca devrait passer normalement

Voilà ^^ c’est ca que je voulais moi :smiley: savoir comment insérer dans mon tableau les données à la place voulue :ane:

/kiss ^^

PS: rien à voir mais : need potions de soins à StarShine :smiley:

Bon reUP du topic : toujours plus beau, toujours plus fort, et toujours plus vite :slight_smile:

Donc grosso merdo mon soucis est proche, mais encore plus compliqué :wink: Enfin pour moi ^^

Je veux un graphique de données "accumulées", jpgraph il sait faire je dois ==>

  • créer un array pour chaque jeu de data (12 mois = 12 éléments dans chaque array, 0 par défaut comme dalai l’a montré avec brio avant :D).
  • créer ces array en fonction du nombre de TYPE de data à présenter, ce qui est variable…

donc
$data1y = array (0,0,0,0,0,0,0,0,0,0,0,0);
$data2y = array (0,0,0,0,0,0,0,0,0,0,0,0);

En gros faut incrémenter tant que j’ai des types d’avaries à afficher. Le plus simple semble de donner à chaque array le numéro ID du type d’avarie. Mais je sais pas comment donner le numéro d’id dans mon “nom” de variable…

Ma requête SQL, ressemble en gros à un truc de ce genre (je pense) :

SQL
$query = “SELECT natures.Nature, COUNT( vehicules.Nature ) AS countVIN FROM vehicules, natures, lots WHERE vehicules.Nature = natures.idNature AND vehicules.idLot = lots.idLot AND vehicules.Lieu = ‘$lieu’ $queryTemp1 $queryTemp2 AND lots.dateLot BETWEEN ‘2005-1-1’ AND ‘2005-12-31’ GROUP BY vehicules.Nature”;

Il manque des trucs, mais c’est elle utilisée pour le précédent graphique qui m’a posé problème.

Ensuite jpgraph demande qu’on produise un array d’array :
$ab1plot = new AccBarPlot(array($data1y,$data2y…);

Là encore je sais pas comment gérer ca dynamiquement.

Bon je suis pas certain que mes explications soient optimales, mais si vous avez déjà une vague idée de mon problème… toute aide sera appréciée ^^

Ca doit donner ca =>

http://img215.imageshack.us/img215/8963/accumulatedplot8pc.th.png

Voilà le code de l’exemple de jpgraph, c’est lui qui génère le graph montré ci dessus :


$data1y=array(12,8,19,3,10,5);
$data2y=array(8,2,11,7,14,4);
$data3y=array(3,9,2,7,5,8);
$data4y=array(1,5,11,2,14,4);

// Create the graph. These two calls are always required
$graph = new Graph(800,400,"auto");    
$graph->SetScale("textlin");

$graph->SetShadow();
$graph->img->SetMargin(40,30,20,40);

$b1plot = new BarPlot($data1y);
$b1plot->SetFillColor("orange");
$b2plot = new BarPlot($data2y);
$b2plot->SetFillColor("blue");
$b3plot = new BarPlot($data3y);
$b3plot->SetFillColor("green");
$b4plot = new BarPlot($data4y);
$b4plot->SetFillColor("brown");

// Create the accumulated bar plots
$ab1plot = new AccBarPlot(array($b1plot,$b2plot,$b3plot,$b4plot));

// Create the grouped bar plot
$gbplot = new GroupBarPlot(array($ab1plot));

// ...and add it to the graph
$graph->Add($gbplot);

En clair mon soucis principal c’est que mes array de départ sont dynamiques => ils peuvent être plus ou moins nombreux :confused: :smiley:

Bon je tente d’innover un truc :

while (sql stuff is ok)
{
$data.($data[‘Lieu’]).y[($data[‘monthLot’])-1] = $data[‘monthVIN’];
}

En gros :

$data1y[10-1] = 150;

pour les 150 véhicules du mois d’octobre dont l’avarie est de type 1.

Ma requête SQL est pas franchement finalisée, ca a une chance de marcher mon truc ?

Bon je continue le monoogue (lol).

Alors ma requête qui semble fonctionner :

SQL
[color=blue;font-weight:bold]SELECT[/color] natures.idNature, COUNT(vehicules.Nature) AS countVIN, DATE_FORMAT(dateLot,'%m') AS monthLot FROM lots, natures, vehicules WHERE EXTRACT(YEAR FROM dateLot) = '2005' AND vehicules.Nature = natures.idNature AND vehicules.idLot = lots.idLot GROUP BY monthLot, natures.Nature ORDER BY monthLot ASC, idNature ASC

Ca semble donner les bons scores :
idNature - countVIN - monthLot
1 - 64 - 09
2 - 16 - 10
3 - 20 - 10
1 - 66 - 11
2 - 1 - 11
3 - 6 - 11

Reste a faire des array de tout ce merdier, et là… :smiley:

je me permet un up, parce que je bloque total là sérieux… les array c’est vraiment pas ma passion, et c’est un des derniers trucs qu’il me reste à terminer là :frowning:

please ^^

je vois pas trop ce qui pose probleme concernant un nombre variable de tableaux(si c’est bien ce que j’ai compris)

un p’tit peu de réflexion(2secondes,+20 pour taper le code :), enfin pas beaucoup quoi), bonne connaissance des tableaux multidimensionnels et ca donne ca(etant un adepte des tableaux :))

(je n’ai pas testé, j’ai écris de tete, mais ca devrais fonctionner, ou tout du moins c’est la voix)


$data_y = array();
$data_y[] =array('couleur'=>'orange','data'=>array(12,8,19,3,10,5)));
$data_y[] =array('couleur'=>'blue','data'=>array(8,2,11,7,14,4));
$data_y[] =array('couleur'=>'green','data'=>array(3,9,2,7,5,8));
$data_y[] =array('couleur'=>'blue','data'=>array(1,5,11,2,14,4));
//tes autres données $data_y[] = ...
// Create the graph. These two calls are always required
$graph = new Graph(800,400,"auto");    
$graph->SetScale("textlin");

$graph->SetShadow();
$graph->img->SetMargin(40,30,20,40);

//tableau qui contiendra les objets BarPlot
$bplot= array();
//pour chaque plot
foreach($data_y as $dataplot) {
  //objet temporaire qu'on balance dans le bplot
  $tmp = new BarPlot($dataplot['data']);
  $tmp->SetFillColor($dataplot['couleur']);
  $bplot[] = $tmp;
}


// Create the accumulated bar plots
$ab1plot = new AccBarPlot($bplot);

// Create the grouped bar plot
$gbplot = new GroupBarPlot(array($ab1plot));

// ...and add it to the graph
$graph->Add($gbplot);

Le truc c’est que j’ai du mal avec les tableaux, donc moi ca m’étonne pas spécialement… php c’est ni ma formation, ni mon métier ^^ j’en fais “vraiment” depuis fin aout :slight_smile:

Je verrais demain si j’arrive à faire qqch avec ca, mais sincèrement j’y comprends pas grand chose pour l’instant :slight_smile: merci du coup de main néanmoins !

Ok en effet ta méthode semble fonctionner, j’ai recopié ton code et ca fonctionne avec des data fixes…

Je comprends, grosso modo, le principe mais bon je pense pas que je saurais le refaire sur une autre situation ^^ j’ai un peu du mal avec les tableaux et leur manipulation.

Si je capte bien tu fais un tableau associatif couleur => value, data => mes data value et ensuite tu boucles pour rebalancer ca dans les fonctions du générateur de graph…

En effet ca semble aprfaitement logique… reste à trouver comment je gère les couleurs qui ne sont pas dans ma base de données :wink: