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
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 :
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:

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
ÇA FONCTIONNE ! ! ! ! !
// 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 !!!
1
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
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 ?
0
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
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
..
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
bonjour,
Moi j'adapterais la requête, afin que, dans la réponse, chaque année soit présente pour chaque prestation.
0
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
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
0
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
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 ?
0
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
Il est tout à fait possible d'écrire une requête qui fait cela.
0
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
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++;
    }
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 à 19:33
Je pense qu'il serait beaucoup plus simple d'utiliser l'année comme clé, ainsi:
$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".
0
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
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...
0
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
Sur stackoverflow, on me propose ça :


$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
)

)
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
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 !

// 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']);            
        }
    }
0
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
moi je ferais:
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)
0
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


$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++;
}
      

0
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


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
)

)

0
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
Je me demande si tu as bien adapté le code que j'ai suggéré: (et faire de même pour RESTAURATION)
0
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
J'espère que je me suis trompé, parce que là, je ne comprends plus rien !

// 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/
0
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
Celui là fonctionne, mais il n'est pas dynamique évidement !
$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
)

)
0
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
alors peut-être en ajoutant une boucle
$h=[];
foreach (  $hebergement as $val) {
    $h[]  = $val;
}
et en utilisant ensuite $h.
0
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
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 !

// 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
)

)
0
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
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 :
// 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
0
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
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 :
/// 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);
0
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
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
0
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
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
0
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
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 
0
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

#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

0
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
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 
0
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
0
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
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 
0
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

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 ?

0
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

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.

0
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
BINGO !
0
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

Mais pour un néophyte, ta requête c'est de l'hébreux ! 

0
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

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.

1