Comment remplir un array quand les données n'existent pas ?
Résolu/Fermé
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
-
Modifié le 4 juil. 2022 à 23:06
yg_be Messages postés 23449 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 janvier 2025 - 8 juil. 2022 à 21:26
yg_be Messages postés 23449 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 janvier 2025 - 8 juil. 2022 à 21:26
A voir également:
- Comment remplir un array quand les données n'existent pas ?
- Organigramme a remplir word - Guide
- Supprimer les données de navigation - Guide
- Comment sauvegarder toutes les données de mon téléphone - Guide
- Remplir et signer pdf - Guide
- Reinstaller windows sans perte de données - Guide
12 réponses
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
Modifié le 6 juil. 2022 à 23:24
Modifié le 6 juil. 2022 à 23:24
Ç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 !!!
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
4 juil. 2022 à 23:12
4 juil. 2022 à 23:12
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 ?
jordane45
Messages postés
38397
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 janvier 2025
4 732
4 juil. 2022 à 23:28
4 juil. 2022 à 23:28
En fait, il faudrait réaliser une boucle sur chaque année souhaitée, à l'intérieur de cette boucle vérifier si une valeur existe ... Et si elle n'existe pas, ajouter une entrée au tableau avec la valeur 0
..
..
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
5 juil. 2022 à 08:22
5 juil. 2022 à 08:22
bonjour,
Moi j'adapterais la requête, afin que, dans la réponse, chaque année soit présente pour chaque prestation.
Moi j'adapterais la requête, afin que, dans la réponse, chaque année soit présente pour chaque prestation.
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
>
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
5 juil. 2022 à 08:55
5 juil. 2022 à 08:55
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
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
>
jordane45
Messages postés
38397
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 janvier 2025
5 juil. 2022 à 09:00
5 juil. 2022 à 09:00
C'est intéressant parce-que c'est exactement ce qui m'est venu à l'esprit en #1, mais je croyais que c'était mal une boucle dans une boucle ?
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
>
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
5 juil. 2022 à 10:07
5 juil. 2022 à 10:07
Il est tout à fait possible d'écrire une requête qui fait cela.
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
5 juil. 2022 à 16:46
5 juil. 2022 à 16:46
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++; }
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
5 juil. 2022 à 19:33
5 juil. 2022 à 19:33
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".
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
>
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
5 juil. 2022 à 22:08
5 juil. 2022 à 22:08
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...
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
Modifié le 5 juil. 2022 à 23:18
Modifié le 5 juil. 2022 à 23:18
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
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
Modifié le 6 juil. 2022 à 00:00
Modifié le 6 juil. 2022 à 00:00
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']); } }
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
Modifié le 6 juil. 2022 à 08:50
Modifié le 6 juil. 2022 à 08:50
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)
jordane45
Messages postés
38397
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 janvier 2025
4 732
6 juil. 2022 à 08:37
6 juil. 2022 à 08:37
$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++; }
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
6 juil. 2022 à 15:36
6 juil. 2022 à 15:36
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
)
)
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
6 juil. 2022 à 17:49
6 juil. 2022 à 17:49
Je me demande si tu as bien adapté le code que j'ai suggéré: (et faire de même pour RESTAURATION)
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
>
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
Modifié le 6 juil. 2022 à 19:44
Modifié le 6 juil. 2022 à 19:44
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/
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
>
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
6 juil. 2022 à 19:47
6 juil. 2022 à 19:47
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
)
)
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
>
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
6 juil. 2022 à 20:30
6 juil. 2022 à 20:30
alors peut-être en ajoutant une boucle
$h=[]; foreach ( $hebergement as $val) { $h[] = $val; }et en utilisant ensuite $h.
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
>
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
Modifié le 6 juil. 2022 à 21:49
Modifié le 6 juil. 2022 à 21:49
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
)
)
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
6 juil. 2022 à 15:50
6 juil. 2022 à 15:50
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
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
7 juil. 2022 à 01:00
7 juil. 2022 à 01:00
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
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
Ambassadeur
1 564
7 juil. 2022 à 07:56
7 juil. 2022 à 07:56
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
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
7 juil. 2022 à 10:11
7 juil. 2022 à 10:11
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
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
>
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
7 juil. 2022 à 10:45
7 juil. 2022 à 10:45
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
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
>
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
7 juil. 2022 à 11:14
7 juil. 2022 à 11:14
#1054 - Champ 'CA.date_debut' inconnu dans field list
J'ai essayé avec T.date_debut ou les autres alias, j'ai toujours une erreur
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
>
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
7 juil. 2022 à 11:51
7 juil. 2022 à 11:51
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
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
Modifié le 7 juil. 2022 à 23:07
Modifié le 7 juil. 2022 à 23:07
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
8 juil. 2022 à 10:50
8 juil. 2022 à 10:50
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
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
>
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
8 juil. 2022 à 15:41
8 juil. 2022 à 15:41
Cette fois ci c'est #1054 - Champ 'AN.ANNEE' inconnu dans on clause
Je te remercie pour tant de dévotion et de patience !
Il y a t-il un moyen pour t'aider ?
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
>
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
8 juil. 2022 à 19:58
8 juil. 2022 à 19:58
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.
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
8 juil. 2022 à 20:28
8 juil. 2022 à 20:28
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
8 juil. 2022 à 20:32
8 juil. 2022 à 20:32
Mais pour un néophyte, ta requête c'est de l'hébreux !
yg_be
Messages postés
23449
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 janvier 2025
1 564
>
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
8 juil. 2022 à 21:26
8 juil. 2022 à 21:26
Pas certain que la requête de départ soit beaucoup plus claire pour un néophyte...
Si tu es plus à l'aise avec la requête initiale et les manipulations en PHP, c'est une façon tout-à-fait correcte d'arriver à une solution.