Comment remplir un array quand les données n'existent pas ?
Résolu
emrh
Messages postés
427
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous,
J'ai eu de l'aide sur ce forum pour l'écriture d'une requête qui fonctionne maintenant parfaitement et dont le travail est de récupérer dans une table les prestations "hébergement" et "restauration" sous forme d'un total cumulé par année, par prestation.
cf discussion : https://forums.commentcamarche.net/forum/affich-37629913-requete-qui-totalise-selon-des-criteres#p37630598
Les totaux obtenus sont stockées dans deux array distincts qui sont ensuite récupérés en Javascript pour être affichés sous forme d'un graphique (https://canvasjs.com/php-charts/dynamic-live-column-chart/.
Tout fonctionne nickel... sauf... si une année ne contient pas de prestation restauration par exemple. L'enregistrement qui n'existe pas n'est donc pas créé dans l'array, on se retrouve donc avec un décalage dans le traitement Javascript, et le graphique est faux !
Si je force manuellement l'année qui n'a pas de restauration avec :
$restauration[] = array("label"=> "2018", "y"=> 0);
alors on retrouve une "symétrie" entre les données hébergement et restauration et le graphique en colonne redevient juste
Voici le code php :
En résumé, comment faire pour qu'une année qui ne contient pas telle ou telle prestation puisse avoir un complément dont la valeur serait 0 ?
Array avec une valeur bidon de 100€ en restauration pour 2023 :
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)
[1] => Array
(
[label] => 2022
[y] => 64913.0100
)
)
Array
(
[0] => Array
(
[label] => 2023
[y] => 100.0000
)
[1] => Array
(
[label] => 2022
[y] => 12944.5000
)
)

Array sans les 100 € bidon :
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)
[1] => Array
(
[label] => 2022
[y] => 64913.0100
)
)
Array
(
[0] => Array
(
[label] => 2022
[y] => 12944.5000
)
)

Merci d'avance pour votre aide !
Configuration: Configuration: Configuration: Linux / Chrome 103.0.0.0
J'ai eu de l'aide sur ce forum pour l'écriture d'une requête qui fonctionne maintenant parfaitement et dont le travail est de récupérer dans une table les prestations "hébergement" et "restauration" sous forme d'un total cumulé par année, par prestation.
cf discussion : https://forums.commentcamarche.net/forum/affich-37629913-requete-qui-totalise-selon-des-criteres#p37630598
Les totaux obtenus sont stockées dans deux array distincts qui sont ensuite récupérés en Javascript pour être affichés sous forme d'un graphique (https://canvasjs.com/php-charts/dynamic-live-column-chart/.
Tout fonctionne nickel... sauf... si une année ne contient pas de prestation restauration par exemple. L'enregistrement qui n'existe pas n'est donc pas créé dans l'array, on se retrouve donc avec un décalage dans le traitement Javascript, et le graphique est faux !
Si je force manuellement l'année qui n'a pas de restauration avec :
$restauration[] = array("label"=> "2018", "y"=> 0);
alors on retrouve une "symétrie" entre les données hébergement et restauration et le graphique en colonne redevient juste
Voici le code php :
while ($data = $requete1->fetch()) { // Hébergement : if($data['P_TYPE']=="HEBERGEMENT"){ $hebergement[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); } // Restauration : if($data['P_TYPE']=="RESTAURATION"){ $restauration[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); } }
En résumé, comment faire pour qu'une année qui ne contient pas telle ou telle prestation puisse avoir un complément dont la valeur serait 0 ?
Array avec une valeur bidon de 100€ en restauration pour 2023 :
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)
[1] => Array
(
[label] => 2022
[y] => 64913.0100
)
)
Array
(
[0] => Array
(
[label] => 2023
[y] => 100.0000
)
[1] => Array
(
[label] => 2022
[y] => 12944.5000
)
)

Array sans les 100 € bidon :
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)
[1] => Array
(
[label] => 2022
[y] => 64913.0100
)
)
Array
(
[0] => Array
(
[label] => 2022
[y] => 12944.5000
)
)

Merci d'avance pour votre aide !
Configuration: Configuration: Configuration: Linux / Chrome 103.0.0.0
A voir également:
- Comment remplir un array quand les données n'existent pas ?
- Fuite données maif - Guide
- Organigramme a remplir word - Guide
- Supprimer les données de navigation - Guide
- Trier des données excel - Guide
- Comment remplir un document pdf - Guide
12 réponses
ÇA FONCTIONNE ! ! ! ! !
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)
[1] => Array
(
[label] => 2022
[y] => 64913.0100
)
)
Array
(
[0] => Array
(
[label] => 2023
[y] => 0
)
[1] => Array
(
[label] => 2022
[y] => 12944.5000
)
)

EDIT : MILLE MERCIS À JORDAN45 & YG_BE POUR VOS PRÉCIEUX CONSEILS ET SURTOUT POUR VOTRE PATIENCE !!!
// Remplissage des Array : while ($data = $requete3->fetch()) { // Hébergement : if ($data['P_TYPE']=="HEBERGEMENT"){ if(isset($anneehebergement) AND $anneehebergement<>''){ $restauration[] = array("label"=> $anneehebergement, "y"=> 0); $anneehebergement=''; $hebergement[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); } else { $hebergement[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); $anneehebergement=$data['ANNEE']; } } // Restauration : if ($data['P_TYPE']=="RESTAURATION"){ if(isset($anneerestauration) AND $anneerestauration<>''){ $hebergement[] = array("label"=> $anneerestauration, "y"=> 0); $anneerestauration=''; $restauration[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); } else { $restauration[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); $anneerestauration=$data['ANNEE']; } } }
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)
[1] => Array
(
[label] => 2022
[y] => 64913.0100
)
)
Array
(
[0] => Array
(
[label] => 2023
[y] => 0
)
[1] => Array
(
[label] => 2022
[y] => 12944.5000
)
)

EDIT : MILLE MERCIS À JORDAN45 & YG_BE POUR VOS PRÉCIEUX CONSEILS ET SURTOUT POUR VOTRE PATIENCE !!!
Je me demande si la solution ne serait pas un traitement dans la boucle WHILE qui vérifie si au moins un enregistrement de chaque prestation a bien été enregistré dans l'année qui vient d'être traitée, si c'est le cas on continue la boucle, sinon on crée un enregistrement à 0 pour la prestation qui n'a pas eu de mouvement dans l'année ?
Bonjour yg_be,
Le problème c'est que l'on ne connait pas les années par avance (le graphique doit être dynamique pour afficher 2025 quand elle existera) et certaines années passées n'avaient pas de prestations RESTAURATION. C'est ces années qui génèrent des trous dans l'array qui ensuite déreglent le graphique
Le problème c'est que l'on ne connait pas les années par avance (le graphique doit être dynamique pour afficher 2025 quand elle existera) et certaines années passées n'avaient pas de prestations RESTAURATION. C'est ces années qui génèrent des trous dans l'array qui ensuite déreglent le graphique
Est-ce qu'un truc comme ça, ce serait une bonne idée ?
$i=0; while ($data = $requete1->fetch()) { if(isset($nmoins1)&&($nmoins1-$data['ANNEE'])>=1){ if(!isset($hebergement[$i]['y'])) { // Traitement ajout Array } } // Hébergement : if($data['P_TYPE']=="HEBERGEMENT"){ $hebergement[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); $nmoins1 = $data['ANNEE']; } // Restauration : if($data['P_TYPE']=="RESTAURATION"){ $restauration[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); $nmoins1 = $data['ANNEE']; } $i++; }
Je pense qu'il serait beaucoup plus simple d'utiliser l'année comme clé, ainsi:
De cette façon, tu peux, quand tu traites un hébergement, vérifier si il y a une entrée pour l'année dans la table restauration, et, sinon, y ajouter une entrée "bidon".
$hebergement[$data['ANNEE']] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
De cette façon, tu peux, quand tu traites un hébergement, vérifier si il y a une entrée pour l'année dans la table restauration, et, sinon, y ajouter une entrée "bidon".
Le problème c'est que canvasjs.com a besoin en sortie d'un format de ce type :
$dataPoints = array(
array("label"=> "Core 1", "y"=> 20),
array("label"=> "Core 2", "y"=> 65),
array("label"=> "Core 3", "y"=> 11)
);
(cf => https://canvasjs.com/php-charts/dynamic-live-column-chart/)
Que j'ai adapté à mon cas pour de 2 types de données :
// Hébergement :
$hebergement = array(
array("label"=> "2023", "y"=> 0),
array("label"=> "2022", "y"=> 123456),
array("label"=> "2021", "y"=> 68279)
);
// Restauration :
$restauration = array(
array("label"=> "2023", "y"=> 0),
array("label"=> "2022", "y"=> 78910),
array("label"=> "2021", "y"=> 12117)
);
Et c'est justement ce double array qui semble poser un problème, non pas en données statiques
mais en données dynamiques issues de la bdd
Ta proposition donne ça :
Array
(
[2023] => Array
(
[label] => 2023
[y] => 2200.0000
)
[2022] => Array //<=============== Erreur, ici c'est 2023 normalement
(
[label] => 2022
[y] => 64913.0100
)
)
Array
(
[2022] => Array
(
[label] => 2022
[y] => 12944.5000
)
)
Et le graphique reste vide...
$dataPoints = array(
array("label"=> "Core 1", "y"=> 20),
array("label"=> "Core 2", "y"=> 65),
array("label"=> "Core 3", "y"=> 11)
);
(cf => https://canvasjs.com/php-charts/dynamic-live-column-chart/)
Que j'ai adapté à mon cas pour de 2 types de données :
// Hébergement :
$hebergement = array(
array("label"=> "2023", "y"=> 0),
array("label"=> "2022", "y"=> 123456),
array("label"=> "2021", "y"=> 68279)
);
// Restauration :
$restauration = array(
array("label"=> "2023", "y"=> 0),
array("label"=> "2022", "y"=> 78910),
array("label"=> "2021", "y"=> 12117)
);
Et c'est justement ce double array qui semble poser un problème, non pas en données statiques
mais en données dynamiques issues de la bdd
Ta proposition donne ça :
Array
(
[2023] => Array
(
[label] => 2023
[y] => 2200.0000
)
[2022] => Array //<=============== Erreur, ici c'est 2023 normalement
(
[label] => 2022
[y] => 64913.0100
)
)
Array
(
[2022] => Array
(
[label] => 2022
[y] => 12944.5000
)
)
Et le graphique reste vide...
Sur stackoverflow, on me propose ça :
Mais ça ne fonctionne pas...
J'ai pourtant adapté :
$min = 2015; // Date de début de mon graphique
$max = 2023; // J'ai déjà des réservations en 2023
for ($i=$max; $i>=$min; $i--) { // Parce que ma requête est classée en DESC et que je souhaite l'année la plus récente en premier à gauche
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)
[1] => Array
(
[label] => 2022
[y] => 64913.0100
)
[2] => Array
(
[label] => 2023
[y] => 0
)
)
Array
(
[0] => Array
(
[label] => 2022
[y] => 12944.5000
)
[1] => Array
(
[label] => 2023
[y] => 0
)
)
$min = 9999; $max = date("Y"); //edited while ($data = $requete1->fetch()) { // Hébergement : if($data['P_TYPE']=="HEBERGEMENT"){ $hebergement[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); } // Restauration : if($data['P_TYPE']=="RESTAURATION"){ $restauration[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); } /// Find the min year in datas if ($data['ANNEE'] < $min) $min = $data['ANNEE']; } /// Cycle between min and max, and add zero padding value when data is missing for ($i=$min; $i<=$max; $i++) { // Those are to search in a multidimensional associative array by key/value. If a value is missing, it adds it. if (!array_search($i, array_column($restauration, 'label'))) $restauration[] = array("label"=> $i, "y"=> 0); if (!array_search($i, array_column($hebergement, 'label'))) $hebergement[] = array("label"=> $i, "y"=> 0); }
Mais ça ne fonctionne pas...
J'ai pourtant adapté :
$min = 2015; // Date de début de mon graphique
$max = 2023; // J'ai déjà des réservations en 2023
for ($i=$max; $i>=$min; $i--) { // Parce que ma requête est classée en DESC et que je souhaite l'année la plus récente en premier à gauche
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)
[1] => Array
(
[label] => 2022
[y] => 64913.0100
)
[2] => Array
(
[label] => 2023
[y] => 0
)
)
Array
(
[0] => Array
(
[label] => 2022
[y] => 12944.5000
)
[1] => Array
(
[label] => 2023
[y] => 0
)
)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Serait-il judicieux de s'inspirer de cette idée en créant tout d'abord 2 array (Hébergement + Restauration) de la première année trouvée dans la bdd à la dernière... Remplir ce tableau de 0 et le mettre à jour avec les valeur trouvées dans la bdd à l'aide de la boucle WHILE ?
Un peu comme ça, mais pour le remplissage avec les bonnes valeurs, cela semble peu fiable !
ou ça :
Un peu comme ça, mais pour le remplissage avec les bonnes valeurs, cela semble peu fiable !
// Recherche de la date la plus récente : $requete1 = $bdd->query('SELECT MAX(YEAR(contrats.date_debut)) as MAX FROM contrats'); $max = $requete1->fetch(); // Recherche de la date la plus ancienne : $requete2 = $bdd->query('SELECT MIN(YEAR(contrats.date_debut)) as MIN FROM contrats'); $min = $requete2->fetch(); // Cumule des prestations par année et par type Restauration ou non : $requete3 = $bdd->query(' SELECT ANNEE, T.P_TYPE, SUM(T.total) AS ca_total FROM ( SELECT C.prix*C.quantites AS total,CA.etat, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM compositions C INNER JOIN contrats CA ON C.id_contrat=CA.id_contrat INNER JOIN prestations P ON P.id_prestation = C.id_prestation) AS T WHERE T.etat=3 GROUP BY T.ANNEE, T.P_TYPE ORDER BY T.ANNEE DESC '); // Création des l'Array Hébergement & restauration vides : for ($i=$min['MIN']; $i <= $max['MAX'] ; $i++) { $hebergement[] = array("label"=> $i, "y"=> 0); $restauration[] = array("label"=> $i, "y"=> 0); } // Remplissage des Array avec les bonnes valeurs : $i=0; while ($data = $requete3->fetch()) { // Hébergement : if($data['P_TYPE']=="HEBERGEMENT"){ $hebergement[$i] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); } // Restauration : if($data['P_TYPE']=="RESTAURATION"){ $restauration[$i] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); } $i++; }
ou ça :
// Remplissage des Array avec les bonnes valeurs : while ($data = $requete3->fetch()) { // Hébergement : if($data['P_TYPE']=="HEBERGEMENT"){ $key = array_search($data['ANNEE'], $hebergement); $hebergement[$key] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); } // Restauration : if($data['P_TYPE']=="RESTAURATION"){ $key = array_search($data['ANNEE'], $restauration); $restauration[$key] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); } }
moi je ferais:
EDIT: avec ta requête initiale, celle du début de cette discussion.
(et faire de même pour RESTAURATION)
if($data['P_TYPE']=="HEBERGEMENT"){ $key = $data['ANNEE']; $hebergement[$key] = array("label"=> $key, "y"=> $data['ca_total']); if ( ! isset($restauration[$key]) ) { $restauration[$key] = array("label"=> $key, "y"=> 0); } }
EDIT: avec ta requête initiale, celle du début de cette discussion.
(et faire de même pour RESTAURATION)
$i=0; $hebergement=[]; $restauration=[]; // Remplissage des Array avec les bonnes valeurs : while ($data = $requete3->fetch()) { $hebergement[$i] = array("label"=> $data['ANNEE']); $restauration[$i] = array("label"=> $data['ANNEE']); // Hébergement : $hebergement[$i]["y"] = $data['P_TYPE']=="HEBERGEMENT" ? $data['ca_total'] : null; // Restauration : $restauration[$i]["y"] = $data['P_TYPE']=="RESTAURATION" ? $data['ca_total'] : null; $i++; }

Je suis désolé Messieurs mais aucune syntaxe ne donne d'affichage !
Dans le cas du code de yg_be j'ai ça en sortie :
Array
(
[0] => Array
(
[label] => 2022
[y] => 64913.0100
)
[2022] => Array
(
[label] => 2022
[y] => 0
)
)
Array
(
[2023] => Array
(
[label] => 2023
[y] => 0
)
[2022] => Array
(
[label] => 2022
[y] => 12944.5000
)
)
et pour le code de Jordan45 ça :
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)
[1] => Array
(
[label] => 2022
[y] => 64913.0100
)
[2] => Array
(
[label] => 2022
[y] =>
)
)
Array
(
[0] => Array
(
[label] => 2023
[y] =>
)
[1] => Array
(
[label] => 2022
[y] =>
)
[2] => Array
(
[label] => 2022
[y] => 12944.5000
)
)
Si je rempli manuellement les Array dans le format "demandé" par canvasjs
de cette manière :
$hebergement = array( array("label"=> "2023", "y"=> 2200), array("label"=> "2022", "y"=> 64913.01) ); $restauration = array( array("label"=> "2023", "y"=> 0), array("label"=> "2022", "y"=> 12944.50) ); echo "<pre>"; print_r($hebergement); print_r($restauration); echo "</pre>";
J'ai ça en sortie :
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200
)
[1] => Array
(
[label] => 2022
[y] => 64913.01
)
)
Array
(
[0] => Array
(
[label] => 2023
[y] => 0
)
[1] => Array
(
[label] => 2022
[y] => 12944.5
)
)

J'espère que je me suis trompé, parce que là, je ne comprends plus rien !
Array
(
[2023] => Array
(
[label] => 2023
[y] => 2200.0000
)
[2022] => Array
(
[label] => 2022
[y] => 64913.0100
)
)
Array
(
[2023] => Array
(
[label] => 2023
[y] => 0
)
[2022] => Array
(
[label] => 2022
[y] => 12944.5000
)
)
Les années en gras posent problème, on n'est pas dans le format demandé par CanvasJs
Cf :
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200
)
https://canvasjs.com/php-charts/dynamic-live-column-chart/
// Connexion à la bdd : require('connexion.php'); // Cumul des prestations par année et par type Restauration ou non : $requete3 = $bdd->query(' SELECT ANNEE, T.P_TYPE, SUM(T.total) AS ca_total FROM ( SELECT C.prix*C.quantites AS total,CA.etat, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM compositions C INNER JOIN contrats CA ON C.id_contrat=CA.id_contrat INNER JOIN prestations P ON P.id_prestation = C.id_prestation) AS T WHERE T.etat=3 GROUP BY T.ANNEE, T.P_TYPE ORDER BY T.ANNEE DESC '); while ($data = $requete3->fetch()) { if($data['P_TYPE']=="HEBERGEMENT"){ $key = $data['ANNEE']; $hebergement[$key] = array("label"=> $key, "y"=> $data['ca_total']); if ( ! isset($restauration[$key]) ) { $restauration[$key] = array("label"=> $key, "y"=> 0); } } if($data['P_TYPE']=="RESTAURATION"){ $key = $data['ANNEE']; $restauration[$key] = array("label"=> $key, "y"=> $data['ca_total']); if ( ! isset($hebergement[$key]) ) { $hebergement[$key] = array("label"=> $key, "y"=> 0); } } } echo "<pre>"; print_r($hebergement); print_r($restauration); echo "</pre>";
Array
(
[2023] => Array
(
[label] => 2023
[y] => 2200.0000
)
[2022] => Array
(
[label] => 2022
[y] => 64913.0100
)
)
Array
(
[2023] => Array
(
[label] => 2023
[y] => 0
)
[2022] => Array
(
[label] => 2022
[y] => 12944.5000
)
)
Les années en gras posent problème, on n'est pas dans le format demandé par CanvasJs
Cf :
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200
)
https://canvasjs.com/php-charts/dynamic-live-column-chart/
Celui là fonctionne, mais il n'est pas dynamique évidement !
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200
)
[1] => Array
(
[label] => 2022
[y] => 64913.01
)
)
Array
(
[0] => Array
(
[label] => 2023
[y] => 0
)
[1] => Array
(
[label] => 2022
[y] => 12944.5
)
)
$hebergement = array( array("label"=> "2023", "y"=> 2200), array("label"=> "2022", "y"=> 64913.01) ); $restauration = array( array("label"=> "2023", "y"=> 0), array("label"=> "2022", "y"=> 12944.50) );
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200
)
[1] => Array
(
[label] => 2022
[y] => 64913.01
)
)
Array
(
[0] => Array
(
[label] => 2023
[y] => 0
)
[1] => Array
(
[label] => 2022
[y] => 12944.5
)
)
Je vais essayer ta proposition....
En attendant, voici ce que je suis en train d'essayer, je suis presque au but, mais il doit encore y avoir un truc
qui cloche, il me manque toujours une année qq part !
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)
)
Array
(
[0] => Array
(
[label] => 2022
[y] => 0
)
[1] => Array
(
[label] => 2022
[y] => 12944.5000
)
)
En attendant, voici ce que je suis en train d'essayer, je suis presque au but, mais il doit encore y avoir un truc
qui cloche, il me manque toujours une année qq part !
// Remplissage des Array : while ($data = $requete3->fetch()) { // Hébergement : if($data['P_TYPE']=="HEBERGEMENT"){ if(isset($annee) AND ($annee-$data['ANNEE']>=1)){ $restauration[] = array("label"=> $data['ANNEE'], "y"=> 0); $annee=NULL; } else{ $hebergement[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); $annee=$data['ANNEE']; } } // Restauration : if($data['P_TYPE']=="RESTAURATION"){ if(isset($annee) AND ($annee-$data['ANNEE']>=1)){ $hebergement[] = array("label"=> $data['ANNEE'], "y"=> 0); $annee=NULL; } else{ $restauration[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); $annee=$data['ANNEE']; } } }
Array
(
[0] => Array
(
[label] => 2023
[y] => 2200.0000
)
)
Array
(
[0] => Array
(
[label] => 2022
[y] => 0
)
[1] => Array
(
[label] => 2022
[y] => 12944.5000
)
)
Mon code, pour ce qui est de la création des 2 Array vides de données affiche le bon format de sortie
mais c'est après, je ne parviens pas à remplacer les 0 par les bonnes valeurs :
Cette partie semble fonctionner :
Array
(
[0] => Array
(
[label] => 2023
[y] => 0
)
[1] => Array
(
[label] => 2022
[y] => 0
)
)
Array
(
[0] => Array
(
[label] => 2023
[y] => 0
)
[1] => Array
(
[label] => 2022
[y] => 0
)
)
Le graphique s'affiche vide bien évidement MAIS les années sont bien dans l'ordre décroissant, et les valeurs 0 sont bien présentes pour l'hébergement et la restauration...
Après, je ne parviens pas à retrouver le bon enregistrement dans l'Array pour replacer les valeurs 0 par celles de la BDD
mais c'est après, je ne parviens pas à remplacer les 0 par les bonnes valeurs :
Cette partie semble fonctionner :
// Création des l'Array Hébergement & restauration vides : for ($i=$max['MAX']; $i >= $min['MIN'] ; $i--) { $hebergement[] = array("label"=> $i, "y"=> 0); $restauration[] = array("label"=> $i, "y"=> 0); }
Array
(
[0] => Array
(
[label] => 2023
[y] => 0
)
[1] => Array
(
[label] => 2022
[y] => 0
)
)
Array
(
[0] => Array
(
[label] => 2023
[y] => 0
)
[1] => Array
(
[label] => 2022
[y] => 0
)
)
Le graphique s'affiche vide bien évidement MAIS les années sont bien dans l'ordre décroissant, et les valeurs 0 sont bien présentes pour l'hébergement et la restauration...
Après, je ne parviens pas à retrouver le bon enregistrement dans l'Array pour replacer les valeurs 0 par celles de la BDD
Bon le code en #27 n'a fonctionné qu'un temps, jusqu'à ce que j'entre une nouvelle valeur en restauration pour 2023. Du coup, l'Array 2023 qui était rempli à 0 n'était pas modifié et tout était à nouveau décalé !
Je viens de repartir sur l'idée à l'ouverture de la page de créer un Array entièrement vierge et de modifier les entrées en fonction des valeurs lues dans la bdd...
Cette fois ci, ça semble fonctionner, même si j'ajoute, je modifie ou supprime un hébergement ou une restauration !
Voici mon code :
Je viens de repartir sur l'idée à l'ouverture de la page de créer un Array entièrement vierge et de modifier les entrées en fonction des valeurs lues dans la bdd...
Cette fois ci, ça semble fonctionner, même si j'ajoute, je modifie ou supprime un hébergement ou une restauration !
Voici mon code :
/// Connexion à la bdd : require('connexion.php'); // Recherche de la date la plus récente : $requete1 = $bdd->query('SELECT MAX(YEAR(contrats.date_debut)) as MAX FROM contrats'); $max = $requete1->fetch(); // Recherche de la date la plus ancienne : $requete2 = $bdd->query('SELECT MIN(YEAR(contrats.date_debut)) as MIN FROM contrats'); $min = $requete2->fetch(); // Cumule des prestations par année et par type Restauration ou non : $requete3 = $bdd->query(' SELECT ANNEE, T.P_TYPE, SUM(T.total) AS ca_total FROM ( SELECT C.prix*C.quantites AS total,CA.etat, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM compositions C INNER JOIN contrats CA ON C.id_contrat=CA.id_contrat INNER JOIN prestations P ON P.id_prestation = C.id_prestation) AS T WHERE T.etat=3 GROUP BY T.ANNEE, T.P_TYPE ORDER BY T.ANNEE DESC '); // Création des l'Array Hébergement & restauration vides : for ($i=$max['MAX']; $i >= $min['MIN'] ; $i--) { $hebergement[] = array("label"=> $i, "y"=> 0); $restauration[] = array("label"=> $i, "y"=> 0); } // Remplissage des Array : while ($data = $requete3->fetch()) { // Hébergement : if ($data['P_TYPE']=="HEBERGEMENT"){ $id = array_search($data['ANNEE'], array_column($hebergement, 'label')); $hebergement[$id]['y'] = $data['ca_total']; } // Restauration : if ($data['P_TYPE']=="RESTAURATION"){ $id = array_search($data['ANNEE'], array_column($restauration, 'label')); $restauration[$id]['y'] = $data['ca_total']; } } // Remplissage des Array avec les années antérieures à la BDD : // Hébergement : $hebergement[] = array("label"=> 2021, "y"=> 68279); $hebergement[] = array("label"=> 2020, "y"=> 30457); $hebergement[] = array("label"=> 2019, "y"=> 63977); $hebergement[] = array("label"=> 2018, "y"=> 57993); $hebergement[] = array("label"=> 2017, "y"=> 49702); $hebergement[] = array("label"=> 2016, "y"=> 45493); $hebergement[] = array("label"=> 2015, "y"=> 38460); // Restauration : $restauration[] = array("label"=> 2021, "y"=> 12117); $restauration[] = array("label"=> 2020, "y"=> 697); $restauration[] = array("label"=> 2019, "y"=> 2687); $restauration[] = array("label"=> 2018, "y"=> 0); $restauration[] = array("label"=> 2017, "y"=> 40); $restauration[] = array("label"=> 2016, "y"=> 350); $restauration[] = array("label"=> 2015, "y"=> 200);
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
Suggestion de requête qui ne nécessite pas de compléter les résultats:
SELECT AN.ANNEE, TP.P_TYPE, SUM(T.total) AS ca_total FROM (SELECT DISTINCT YEAR(CA.date_debut) as ANNEE FROM compositions ) AS AN, (SELECT DISTINCT IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM prestations ) AS TP, LEFT JOIN ( SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM compositions C INNER JOIN contrats CA ON C.id_contrat=CA.id_contrat INNER JOIN prestations P ON P.id_prestation = C.id_prestation WHERE CA.etat = 3 ) AS T ON AN.ANNEE = T.ANNEE AND TP.P_TYPE = T.P_TYPE GROUP BY AN.ANNEE, TP.P_TYPE ORDER BY AN.ANNEE DESC, TP.P_TYPE
Salut Yg_be,
J'ai fini très tard hier sur mes Array qui fonctionnent enfin (#28) et je n'ai pas encore les yeux en face des trous....
Quelle serait l'utilité de cette requête ? Serait-ce pour éviter le mic mac dans les Array ?
Je l'ai collée dans PhpMyAdmin mais hélas j'ai eu des erreurs :
1 erreurs trouvées lors de l'analyse.
An expression was expected. (near "LEFT JOIN" at position 240)
#1064 - Erreur de syntaxe près de 'LEFT JOIN(SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) AS ANNEE, I...' à la ligne 5
J'ai fini très tard hier sur mes Array qui fonctionnent enfin (#28) et je n'ai pas encore les yeux en face des trous....
Quelle serait l'utilité de cette requête ? Serait-ce pour éviter le mic mac dans les Array ?
Je l'ai collée dans PhpMyAdmin mais hélas j'ai eu des erreurs :
1 erreurs trouvées lors de l'analyse.
An expression was expected. (near "LEFT JOIN" at position 240)
#1064 - Erreur de syntaxe près de 'LEFT JOIN(SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) AS ANNEE, I...' à la ligne 5
En effet, le but serait d'éviter ce mic mac.
SELECT AN.ANNEE, TP.P_TYPE, SUM(T.total) AS ca_total FROM (SELECT DISTINCT YEAR(CA.date_debut) as ANNEE FROM compositions ) AS AN, (SELECT DISTINCT IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM prestations ) AS TP LEFT JOIN ( SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM compositions C INNER JOIN contrats CA ON C.id_contrat=CA.id_contrat INNER JOIN prestations P ON P.id_prestation = C.id_prestation WHERE CA.etat = 3 ) AS T ON AN.ANNEE = T.ANNEE AND TP.P_TYPE = T.P_TYPE GROUP BY AN.ANNEE, TP.P_TYPE ORDER BY AN.ANNEE DESC, TP.P_TYPE
SELECT AN.ANNEE, TP.P_TYPE, SUM(T.total) AS ca_total FROM (SELECT DISTINCT YEAR(date_debut) as ANNEE FROM compositions ) AS AN, (SELECT DISTINCT IF (type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM prestations ) AS TP LEFT JOIN ( SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM compositions C INNER JOIN contrats CA ON C.id_contrat=CA.id_contrat INNER JOIN prestations P ON P.id_prestation = C.id_prestation WHERE CA.etat = 3 ) AS T ON AN.ANNEE = T.ANNEE AND TP.P_TYPE = T.P_TYPE GROUP BY AN.ANNEE, TP.P_TYPE ORDER BY AN.ANNEE DESC, TP.P_TYPE
SELECT AN.ANNEE, TP.P_TYPE, SUM(T.total) AS ca_total FROM (SELECT DISTINCT YEAR(date_debut) as ANNEE FROM contrats ) AS AN, (SELECT DISTINCT IF (type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM prestations ) AS TP LEFT JOIN ( SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM compositions C INNER JOIN contrats CA ON C.id_contrat=CA.id_contrat INNER JOIN prestations P ON P.id_prestation = C.id_prestation WHERE CA.etat = 3 ) AS T ON AN.ANNEE = T.ANNEE AND TP.P_TYPE = T.P_TYPE GROUP BY AN.ANNEE, TP.P_TYPE ORDER BY AN.ANNEE DESC, TP.P_TYPE
peut-être:
SELECT AN.ANNEE, TP.P_TYPE, SUM(T.total) AS ca_total FROM (SELECT DISTINCT YEAR(date_debut) as ANNEE FROM contrats ) AS AN INNER JOIN (SELECT DISTINCT IF (type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM prestations ) AS TP LEFT JOIN ( SELECT C.prix*C.quantites AS total, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM compositions C INNER JOIN contrats CA ON C.id_contrat=CA.id_contrat INNER JOIN prestations P ON P.id_prestation = C.id_prestation WHERE CA.etat = 3 ) AS T ON AN.ANNEE = T.ANNEE AND TP.P_TYPE = T.P_TYPE GROUP BY AN.ANNEE, TP.P_TYPE ORDER BY AN.ANNEE DESC, TP.P_TYPE
Pour bien faire, je devrais tester avant de t'envoyer.