Boucle for avec comparaison de 1,2,3 avec des 01,02,03

Résolu
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   -  
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour à tous,

Je dois transmettre à l'administration un document PDF sur lequel je liste jour par jour les taxes de séjour perçues.
J'ai donc fait ma requête pour rechercher dans ma bdd les clients qui en avait payé pour le mois concerné et j'ai rempli un array $lignes() avec le résultat de cette requête.
J'aimerai maintenant imprimer via une boucle for le contenu de cet array, le problème est que je n'arrive pas à comparer les 9 premières valeurs de $i de ma boucle (1,2,3...9) à la clé 'jour' de mon array (01,02,03,...09)... 
Du coup, ça bug !
Auriez vous une idée pour résoudre ça ?

$annee_taxe = $_GET['annee'];
$mois_taxe = $_GET['mois'];

// Requête taxes de séjour de l'année et du mois demandé : 
$req_taxes = $bdd->prepare('
    SELECT contrats.date_debut,contrats.date_fin,contrats.adultes,(contrats.enfants+contrats.bebes) AS exo,SUM(compositions.prix*compositions.quantites) AS taxe
    FROM compositions
    INNER JOIN contrats ON contrats.id_contrat = compositions.id_contrat
    INNER JOIN clients ON clients.id_client = contrats.id_client      
    INNER JOIN prestations ON prestations.id_prestation = compositions.id_prestation        
    WHERE contrats.etat > 2 AND clients.pedestria = 0 AND prestations.id_prestation = 21 AND YEAR(contrats.date_debut) = :annee AND MONTH(contrats.date_debut) = :mois
    GROUP BY contrats.date_debut
    ORDER BY contrats.date_debut ASC
');
$req_taxes->execute(array(
    'annee' => $annee_taxe,
    'mois' => $mois_taxe
));
    
$lignes = array();    
// Remplissage de l'array :
while ($data = $req_taxes->fetch()) {
    $lignes[] = array(
        'jour' => substr($data['date_debut'], -2),
        'adultes' => $data['adultes'],
        'exo' => $data['exo'],
        'taxe' => $data['taxe']
    );        
} 
/*echo '<pre>' ;
print_r($lignes);
echo '</pre>';*/
$i=1;
foreach($lignes as $x => $valeur) {
    if($i==$valeur['jour']){
        echo $valeur['jour'] . ' ' . $valeur['adultes'] . ' ' . $valeur['exo'] . ' ' . $valeur['taxe'] . '<br>';
    }
    else {
        echo $i . '<br>';
    }
}


Linux / Chrome 107.0.0.0

A voir également:

6 réponses

emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   20
 

Résolu, c'était pas false qui fallait mettre dans le if mais '' !  (Cf. ligne 26)

$mois_taille = array('1'=>'31','2'=>'28','3'=>'31','4'=>'30','5'=>'31','6'=>'30','7'=>'31','8'=>'31','9'=>'30','10'=>'31','11'=>'30','12'=>'31');

$mois_taxe = $_GET['mois'];

$lignes = array();    
// Remplissage de l'array :
while ($data = $req_taxes->fetch()) {
    $lignes[] = array(
        'jour' => substr($data['date_debut'], -2),
        'adultes' => $data['adultes'],
        'exo' => $data['exo'],
        'taxe' => $data['taxe']
    );        
} 
/*echo '<pre>' ;
print_r($lignes);
echo '</pre>';*/
    
// Initialisation de la boucle selon le nombre de jour/mois : 
for ($i=1; $i <=$mois_taille[$mois_taxe] ; $i++) {
    // $x = formatage du mois avec 0 si < 9
    $x = str_pad($i, 2, "0", STR_PAD_LEFT); 
    // Recherche de l'index du mois $x :
    $index = array_search($x, array_column($lignes, 'jour'));         
    // Si l'index du mois $x existe :
    if($index<>''){
        echo $lignes[$index]['jour'] . '=> ' . $lignes[$index]['adultes'] . ' ' . $lignes[$index]['exo'] . ' ' . $lignes[$index]['taxe'] . '<br>';
    }
    // Sinon :
    else{
        echo $x . '<br>';
    }        
}
1
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

bonjour,

as-tu envisagé, dans le SELECT, d'extraire le jour, en utilisant DAY()?

SELECT contrats.date_debut,contrats.date_fin,contrats.adultes,
    contrats.enfants+contrats.bebes AS exo,
    SUM(compositions.prix*compositions.quantites) AS taxe, 
    DAY(contrats.date_debut) as jour
    FROM compositions
    INNER JOIN contrats ON contrats.id_contrat = compositions.id_contrat
    INNER JOIN clients ON clients.id_client = contrats.id_client      
    INNER JOIN prestations ON prestations.id_prestation = compositions.id_prestation        
    WHERE contrats.etat > 2 AND clients.pedestria = 0 AND prestations.id_prestation = 21 
        AND YEAR(contrats.date_debut) = :annee AND MONTH(contrats.date_debut) = :mois
    GROUP BY contrats.date_debut
    ORDER BY contrats.date_debut ASC

ensuite,

'jour' => $data['jour']
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

Bonjour,

J'ai une préférence pour la solution proposée par Yg_be,

mais au cas où .. tu pourrais aussi simplement "forcer" en numérique la valeur

 if( $i == intVal($valeur['jour']) ){

0
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   20
 

Merci à vous deux pour votre aide mais je me suis mal expliqué...
Je n'ai pas de problème avec le remplissage de l'array en lui même : 

Array
(
    [0] => Array
        (
            [jour] => 01
            [adultes] => 6
            [exo] => 0
            [taxe] => 29.4000
        )

    [1] => Array
        (
            [jour] => 04
            [adultes] => 14
            [exo] => 4
            [taxe] => 30.8000
        )

    [2] => Array
        (
            [jour] => 05
            [adultes] => 10
            [exo] => 0
            [taxe] => 21.0000
        )

    [3] => Array
        (
            [jour] => 30
            [adultes] => 2
            [exo] => 2
            [taxe] => 49.0000
        )

)

Mais plutôt avec la sortie que je voudrais formater comme ça : 

01 06 0 29.40
02
03
04 14 4 30.80
05 10 0 21.00
06
07
... etc ...

J'ai donc besoin d'une boucle for ($i = 1; $i <= 31; $i++) je suppose mais il faut également que je trouve le moyen d'afficher le 0 des nombres à 1 chiffre (1 à 9)

0
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   20
 

D'autre par, je viens de me rendre compte que dans mon post #1 il n'y a pas d'incrémentation du $i, ça ne peut donc pas marcher

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   20
 

Avec : 
for ($i=1; $i <=31 ; $i++) { 
        $i = str_pad($i, 2, "0", STR_PAD_LEFT);
        echo $i . '<br>';
    }
J'ai ma boucle pour écrire les 31 lignes du mois...
Il faut maintenant que j'arrive à comparer la valeur de la clé ['jour'] avec $i sans dépasser les limites de l'array qui quelques fois contient 2 ou 3 enregistrements, des fois aucun ! 

0
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   20
 

L'usine à gaz ci-dessous fonctionne mais je n'ai pas ma première ligne ! 

$mois_taille =array('1'=>'31','2'=>'28','3'=>'31','4'=>'30','5'=>'31','6'=>'30','7'=>'31','8'=>'31','9'=>'30','10'=>'31','11'=>'30','12'=>'31');
$mois_taxe = $_GET['mois'];

// Initialisation de la boucle selon le nombre de jour/mois : 
for ($i=1; $i <=$mois_taille[$mois_taxe] ; $i++) {
    // $x = formatage du mois avec 0 si < 9
    $x = str_pad($i, 2, "0", STR_PAD_LEFT); 
    // Recherche de l'index du mois $x :
    $index = array_search($x, array_column($lignes, 'jour'));         
    // Si l'index du mois $x existe :
    if($index<>false){
        echo $lignes[$index]['jour'] . '=> ' . $lignes[$index]['adultes'] . ' ' . $lignes[$index]['exo'] . ' ' . $lignes[$index]['taxe'] . '<br>';
    }
    // Sinon :
    else{
        echo $x . '<br>';
    }        
}

Une idée ?

Array
(
    [0] => Array
        (
            [jour] => 01
            [adultes] => 19
            [exo] => 0
            [taxe] => 16.1000
        )

    [1] => Array
        (
            [jour] => 15
            [adultes] => 8
            [exo] => 0
            [taxe] => 26.6000
        )

    [2] => Array
        (
            [jour] => 18
            [adultes] => 18
            [exo] => 0
            [taxe] => 67.2000
        )

    [3] => Array
        (
            [jour] => 29
            [adultes] => 9
            [exo] => 0
            [taxe] => 23.8000
        )

)
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15=> 8 0 26.6000
16
17
18=> 18 0 67.2000
19
20
21
22
23
24
25
26
27
28
29=> 9 0 23.8000
30
0
emrh Messages postés 427 Date d'inscription   Statut Membre Dernière intervention   20
 

Pourtant echo $lignes[0]['adultes']; affiche bien 19 !!!

0