Valeur par défaut à 0 pour un array

Résolu/Fermé
DARLAIVE - 15 oct. 2015 à 12:40
DARLAIVE Messages postés 653 Date d'inscription mercredi 29 juillet 2009 Statut Membre Dernière intervention 5 septembre 2016 - 15 oct. 2015 à 14:53
Bonjour,
J'ai une requête SQL (SELECT MONTH(VdateDAFOTC) AS mois, COUNT(*) FROM vega_touslesjalonsv2 WHERE YEAR(VdateDAFOTC) = $annee GROUP BY mois) qui me renvoie un résultat comme ça :
mois count(*)
1 40000
2 300
...
Jusqu'au 12ème mois car comme vous pouvez le voir la requête compte le nombre de VdateDAFOTC par mois sur l'année passé en paramètre.

Je récupère le résultat sous forme d'un tableau PHP (fetch_all) sous cette forme :
Array (
[0] => Array (
[0] => 1 // le mois 1 (Janvier)
[1] => 40000 // le résultat du count(*)
)

[1] => Array (
[0] => 2 // le mois 2 (Février)
[1] => 300 // le résultat du count(*)
)
... // jusqu'à 11 (vu qu'on commence à 0 dans un array)
)

Donc un tableau à 2 dimensions.
Je dois afficher les valeurs du tableau dans un tableau HTML de type DataTables.
Le problème c'est que sur certaines années je n'ai pas de résultat pour Janvier mais pas avant Mars par exemple :
Array (
[0] => Array (
[0] => 3 // le mois 3 (Mars)
[1] => 200 // le résultat du count(*)
)

[1] => Array (
[0] => 4 // le mois 4 (Avril)
[1] => 500 // le résultat du count(*)
)
... // jusqu'à 11 (vu qu'on commence à 0 dans un array)
)

Mais j'ai aussi des années ou j'ai des résultats qui commencent en Janvier mais qui ne se terminent pas en Décembre (2015 par exemple) :
Array (
[0] => Array (
[0] => 1 // le mois 1 (Janvier)
[1] => 200 // le résultat du count(*)
)

[1] => Array (
[0] => 2 // le mois 2 (Février)
[1] => 500 // le résultat du count(*)
)
... // jusqu'à 9 si on prend 2015 (on commence le tableau à 0 mais le mois est à 1 dans le tableau, donc index [9] => [0] donne 10 donc Octobre)
)

Mais j'ai aussi des années ou il manque des mois entre, par exemple je commence bien en Janvier et je termine bien en Décembre mais il me manque Octobre par exemple :
Array (
[0] => Array (
[0] => 1 // le mois 1 (Janvier)
[1] => 200 // le résultat du count(*)
)

[1] => Array (
[0] => 2 // le mois 2 (Février)
[1] => 500 // le résultat du count(*)
)
... // jusqu'à 8 donc mois 9 donc Septembre
// et on continue ensuite jusqu'à Décembre par exemple
[9] => Array (
[0] => 11 // le mois 11 (Novembre)
[1] => 500 // le résultat du count(*)
)
[10] => Array (
[0] => 12 // le mois 12 (Décembre)
[1] => 500 // le résultat du count(*)
)
)

Donc vous voyez un peut le bazar que c'est.
Le problème c'est que je peut pas insérer des valeurs null dans le tableaux HTML sinon j'ai une erreur et il faut que j'insère les valeurs dans l'ordre (la bonne valeur pour le bon mois). Du coup il faut que j'insère des 0 la où j'ai pas de valeurs.
J'ai fait un tableau à 1 dimension que j'ai initialisé à 0 ou je ne récupérerais que les valeurs des mois dans l'ordre.
Du coup maintenant il faudrait faire en sorte d'insérer les valeurs dans l'ordre dans mon deuxième tableau que j'ai créer et laisser la valeur par défaut (0 du coup) quand je n'ai pas de valeur pour ce mois.
Sauf que là je sèche complet.
Ah moins qu'il soit possible de récupérer tout les mois et de mettre 0 à coté dans la requête SQL quand j'ai pas de valeurs, ou alors un moyen de mettre par défaut un 0 dans le tableau HTML (DataTables) quand j'ai pas de valeur.
Si quelqu'un à une idée.
Merci d'avance.

3 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
15 oct. 2015 à 12:49
Salut,

Une solution simple serait juste de tester l'existence du mois dans le tableau des résultats à l'affichage.
Peux tu nous montrer le code d'affichage du tableau html afin de pouvoir t'aider plus facilement ?

Bonne journée,
0
L'affichage ce fait juste via un basique <table> en HTML (j'utilise <thead> et <tbody> aussi), après j'utilise un script pour DataTables :
<script>
$(document).ready(function () {
$('#example').DataTable({ //example étant l'id dans <table>
"paging": false, // je désactive la découpe en plusieurs page
"ordering": true, // j'active le tris
"info": false, // je désactive la ligne qui affiche le nb de ligne tu tab
"searching": false, // je désactive le moteur de recherche du tableau
columnDefs: [
{type: 'date-eu', targets: 5}, // je définis la colonne 5 de type date
{bSortable: false, targets: 0} // je désactive le tri sur la colonne des titres
]
});
});
</script>
Pour le moment j'affiche rien à part des données bidon en dur (c'était pour tester le tableau et voir la longueur qu'il aura).
La j'ai tester des trucs pour insérer les valeurs dans mon deuxième array et j'affiche le tableau avec print_r() pour voir son architecture.
Sauf que du coup j'ai des erreurs d'index avec ce que j'ai tester.
0
J'avais commencer à faire un truc comme ça pour les années qui ne commence pas en Janvier :
$declare2 = array();

for ($i = 0; $i < 12; $i++) {
      $declare2[$i] = 0;
}

if($declare[0][0] > 1){ // si le tableau ne commence pas en Janvier
   $firstIndex = $declare[0][0]; // on récup le 1er mois du tableau declare
   // on insére le reste des valeurs dans l'ordre (on passe d'un tableau 2 dimensions à 1 avec
   // seulement les valeurs par mois pour l'année sur laquelle on fait la requête)
   for($i1 = $firstIndex ; $i1 < 12; $i1++){ // du 1er mois du tableau jusqu'à decembre
        for ($i2 = 0; $i2 < $i1; $i2++){ // on insére les valeurs du mois dans declare 2
        // on commence à insérer les valeurs à partir du 1er mois de declare
        // le 1er mois de declare == l'index ou on doit commencer à insérer dans déclare2
       $declare2[$i1] = $declare[$i2][1];
       }
   }
   print_r($declare2);
}

Sauf que ça marche pas.
Pour information je commence à l'année 2012 jusqu'à 2015 et il n'y à que l'année 2012 qui ne commence pas à Janvier et en plus il manque 1 mois (Octobre) (pour ça aussi que mon code plante).
Les années de 2013 à 2014 commencent en Janvier et ce terminent en Décembre et enfin l'année 2015 commencent en Janvier et n'est pas encore fini (logique). Normalement les autres devrait être pareil (on commencent en Janvier et on attend que l'année ce termine et du coup on aura des 0 en attendant Décembre et les valeurs quand le mois sera fini).
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
Modifié par Pitet le 15/10/2015 à 14:26
Voici un exemple de construction de ton tableau html à partir du résultat de la requête sql :
<?php
$results = array(array('1', '100'), array('2', '200'), array('3', '300'), array('4', '400'), array('5', '500'), array('6', '600'), array('7', '700'), array('8', '800'), array('9', '900'), array('10', '1000'), array('11', '1100'), array('12', '1200'));
// $results = array(array('3', '300'), array('4', '400'), array('5', '500'), array('6', '600'), array('7', '700'), array('8', '800'), array('9', '900'), array('10', '1000'), array('11', '1100'), array('12', '1200'));
// $results = array(array('3', '300'), array('4', '400'), array('5', '500'), array('6', '600'), array('7', '700'), array('8', '800'), array('9', '900'), array('10', '1000'));
?>

<table class="exemple">
    <thead>
        <tr>
            <th>Janvier</th>
            <th>Février</th>
            <th>Mars</th>
            <th>Avril</th>
            <th>Mai</th>
            <th>Juin</th>
            <th>Juillet</th>
            <th>Août</th>
            <th>Septembre</th>
            <th>Octobre</th>
            <th>Novembre</th>
            <th>Décembre</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <?php
            for ($i = 0; $i < 12; $i++) {
                $value = 0;
                
                foreach ($results as $result) {
                    if ($result[0] == $i + 1) {
                        $value = $result[1];
                    }
                }
                
                echo '<td>' . $value . '</td>';
            }
            ?>
        </tr>
    </tbody>
</table>


Tu peux tester ce code avec 3 résultats différents (il suffit de commenter/décommenter les premières lignes) :
- un résultat contenant tous les mois
- un résultat commencant en Mars
- un résultat commencant en Mars et finissant Octobre
0
DARLAIVE Messages postés 653 Date d'inscription mercredi 29 juillet 2009 Statut Membre Dernière intervention 5 septembre 2016 164
15 oct. 2015 à 14:53
T'es un as Pitet, ça fonctionne nickel, j'ai remplacé $results par mon tableau et j'ai inclus l'affichage dans mon tableau et aucun soucis, pas d'erreur, les données sont dans l'ordre et j'ai 0 quand j'ai pas de valeurs.
J'était parti dans des trucs compliqué alors que c'était simple.
Merci encore.
0