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

okay; bon alors problème essentiel comme précédement : faut fixer à 0 les 12 valeurs de chaque array, puisque j’ai 12 mois à afficher…

Ensuite je dois mettre à jour la bonne case de mon array, en fonction du mois au cours duquel je chope des datas…

genre ca : $tableau[($row[‘lotMonth’] - 1)] = nombreVehicules; ce qui est la méthode proposée par dalai précédement.

Sachant que mes tableaux sont dynamiques, comment les fixer à 10 ? précédement j’en avais un ou deux, là j’en ai plus…

no comprendo :paf: …
tu veux mettre la valeur 10 dans chaque case de ton tableau ? > array_fill ?

Alors en fait j’ai :

12 mois à afficher, mais pas des données sur chaque mois => méthode dalai : on set les 12 valeur de mon array à 0, et ensuite on met à jour le row nécessaire (mois des données -1).

Ensuite il s’agit dans jpgraph d’un graphique avec barres accumulées, t’as du comprendre le principe : j’ai plusieurs array, regroupés dans un autre array. Chaque barre représente le nombre véhicules endommagés, mais en plus l’accumulation permet de différencier suivant la nature de l’avarie…

Cf le résultat de ma requête sql :
Numéro de nature (enfin type de nature quoi) - nombre de véhicules - mois concerné… ce qui me donne =>
idNature - countVIN - monthLot
1 - 64 - 09
2 - 16 - 10
3 - 20 - 10
1 - 66 - 11
2 - 1 - 11
3 - 6 - 11

Donc en septembre j’ai 64 avaries pour la nature 1, en octobre j’ai 16 véhicules de nature 2 et 20 de nature 3, et ainsi de suite :slight_smile:

Le nombre de natures est naturellement variable, et donc dynamique (c’est le bon terme non ?)

Donc comment remplir à 0 les 12 cases de mes différents arrays générés ? Je sais pas du tout faire là :confused:

Voilà ce que ca donne, chaque couleur c’est un array différent, et quand y a pas de data renvoyées par mysql, ben faut que value = 0 :smiley:

array_fill te créer un tableau avec une valeur prédéfinis entre différents index …
visualise ça :

print_r( array_fill(0,12,0) );

Vouais ok, mais comment je fais pour inclure ca dans mon bazar ? vu que le nombre d’array créés dépend de la requête SQL Oo

C’est ca en fait que je sais po faire :confused:

Enfin je dois avoir d’autres blocages et bug, mais pourl’instant j’ai déjà ca que je sais pas faire ^^

$sql = "SELECT natures.idNature, COUNT(vehicules.Nature) AS monthVIN, 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";

$requeteID = mysql_query($query);
$data_y[] = array();

while ($data = mysql_fetch_array($requeteID))
{
  $data_Y[] = array('couleur'=>'red','data'=>array($data[monthVIN]));
}

A priori la requête SQL est bonne, enfin je crois , pour le reste… je cherche aussi comment attribuer une couleur différente en fonction des types de nature…

Braif je gallère :frowning:

Mais en fait je me demande : il est vraiment valable dans mon cas le code que mikmak a proposé ? Moi c’est plusieurs array différents suivant le type d’avarie, en revanche c’est UN array par avarie avec des valeurs pour tous les mois.

J’ai pas l’impression que son code fasse réellement ca, si ?

Sur le principe on cherche à obtenir ca en fait =>

array 1 (0,0,0,0,0,0,0,0,0,0,0,0);
array 2 (0,0,0,0,0,0,0,0,0,0,0,0);

Bazar SQL, et mise à jour des row où j’ai des réponses

array1 = collision => (1,2,3,4,5,6,7,8,9,10,11,12);
array2 = vol => (0,0,0,4,5,6,0,0,9,0,11,12);

on va faire plus simple ^^

Je vais nommer mes array en fonction de ma valeur d’id =>

$data_y1
$data_y2

Comment je recase une variable dans le nom ? faut faire un trim ?

genre (mais c’est faux) =>
$data_y($data[Lieu])[($data[‘monthLot’]-1)] = $data[‘value’]; ?

Et ainsi ca serait pas bon :

$tempvar = 'datay'.$data['Lieu']; // je fabrique mon nom de variable
$$tempvar[($data['monthLot']-1)] = $value; // j'insère dans le bon row de mon tableau la valeur que j'ai chopée.

Qu’en pensez vous ?

  1. wouaou ça a l’air compliqué la programmation…

'foiré, moi qui espérais une réponse qui me sauve :frowning: :smiley:

Bon alors j’ai fait un essai “à blanc”… Mais juste de l’intégration des données dans les arrays…


$datay1 = array(0,0,0,0,0,0,0,0,0,0,0,0);
$datay2 = array(0,0,0,0,0,0,0,0,0,0,0,0);
$datay3 = array(0,0,0,0,0,0,0,0,0,0,0,0);

$sql= ""; // osef, j'ai déjà donnée 15 fois :D OUI, elle marche :)

while...
{
$temp = 'datay'.$data['Nature'];
$$temp[($data['monthLot']-1)] = $data['monthVIN'];
}
print_r($datay1);
print_r($datay2);
print_r($datay3);

Alors j’ai vérifé les variables $data[] et elles affichent bien ce qu’elles devraient. En revanche les array ne semblent pas mis à jour, j’en déduis que le mélange $$temp[bazar à dalai] ne fonctionne pas de la façon dont j’ai procédé…

Quand je fais le print_r ca affiche [0]=>0 [1]=>0 [2]=>0… que des 0 :confused:

Allez à vous, sauvez moi ^^

MOZERFOC !!

je viens, de faire un echo $$valeur[($data[‘monthLot’]-1)]; histoire de voir ce que ca donne et ca me retourne… la bonne valeur :confused:

Pourtant print R lui il affiche keudal…

Comprends plus rien :frowning:

Aller je lâche pas l’affaire ^^ j’ai testé une intégration très hardcodée de mon bazar dans le générateur de graphique, et en fait ca n’affiche rien comme valeur, par contre si je change à la main les array en haut et bien naturellement les changements apparaissent dans le graphique (donc ca fonctionne le truc :D).

Un petit coup de pouce serait apprécié, doit pas manquer grand chose là je pense ^^

Ok j’ai compris :

$$temp[($data[‘monthLot’]-1)] = $data[‘monthVIN’];

ca revient en vérité à : $temp = $data[‘monthVIN’];

Du moins c’est ce que semblent indiquer mes essais…

Comment faire alors ?

c’est normal,


$$temp[($data['monthLot']-1)] = $data['monthVIN'];

ne correspond non pas à placer la valeur dans le tableau datay1
MAIS
à placer la valeur dans NULL=$data[‘monthVIN’] …
car un double $$ permet de recuperer la valeur de la variable suivi du 1er $
donc à $temp[($data[‘monthLot’]-1)]
ce tableau $temp n’existant pas, y a bobo

donc tu dois passer par des {} pour dire à php que ton $$ se limite à ta variable $temp

tu aurais pu le remarquer par toi meme si tu avais mis :
error_reporting(E_ALL);
en haut de ton code, habitude a prendre pour bien coder et tracker tout pb de definition de variable

exemple :

mon p’tit test à moi :smiley:

$datay1 = array(0,0,0,0,0,0,0,0,0,0,0,0);
$datay2 = array(0,0,0,0,0,0,0,0,0,0,0,0);
$datay3 = array(0,0,0,0,0,0,0,0,0,0,0,0);


                       
$natures = array(1,2,3);      

for($m =0;$m < 12;$m++) {
  foreach($natures as $nature) {
        $temp = 'datay'.$nature;	
	${$temp}[$m] = rand(1,100);
        /*
       ou encore :

	${'datay'.$nature}[$m] = rand(1,100);
       */
  }       
}
echo '<pre>';
print_r($datay1);
print_r($datay2);
print_r($datay3);
echo '</pre>';
return;     

ok merci beaucoup !!! en fait j’y étais presque car j’avais essayé :

${$temp[($data[‘monthLot’]-1)]} = $data[‘monthVIN’];

En fait il fallait :

${$temp}[($data[‘monthLot’]-1)] = $data[‘monthVIN’];

C’est vrai qu’au final ca semble parfaitement logique ^^ enfin c’est toujours après coup qu’on se dit : mais ouiiiii !!! :smiley:

Bon et bien mon script fonctionne là, enfin le graphique est généré, reste à solutionner d’autres soucis avec ces array à la noix ^^ je crois que je vais pas me casser la tête à générer dynamiquement le bon nombre d’array, je vais en définir 10 à l’avance, et s’ils sont vides ca affichera rien ^^



$query= "SELECT natures.idNature as nature, COUNT(vehicules.Nature) AS hit, DATE_FORMAT (datelot, '%m') AS mois FROM lots, natures, vehicules WHERE EXTRACT (YEAR FROM dateLot) = '2005' AND vehicules.Nature = natures.idNature AND vehicules.idLot ) lots.idLot GROUP BY mois, nature";

$requeteID = mysql_query($query);
$DATA = array();

while ($record = mysql_fetch_assoc($requeteID))
{
 if(!isset($DATA[$record['mois']])) $DATA[$record['mois']]=array();
 $DATA[$record['mois']][$record['nature']]=$record['hit'];
}

mysql_free_result($requeteID);

print_r($DATA);



test (et debug c du total mental) ça …
tu devrais avoir en resultat un tableau de tableaux du type


DATA => {
  MOIS1 => {
    NATURE1 => NBVOITURE,
    NATURE2 => NBVOITURE,
    NATURE3 => NBVOITURE,
   ....
  },
  MOIS2 => {
    NATURE1 => NBVOITURE,
    NATURE2 => NBVOITURE,
    NATURE3 => NBVOITURE,
   ....
  },
  ....
}

top, 3 minutes 33 secondes… bof pas en forme