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

Résolu/Fermé
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - 18 nov. 2022 à 09:27
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - 18 nov. 2022 à 17:22

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 mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
Modifié le 18 nov. 2022 à 17:24

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 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
18 nov. 2022 à 10:50

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 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
18 nov. 2022 à 11:20

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 mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
18 nov. 2022 à 12:18

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 mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
18 nov. 2022 à 12: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 mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
18 nov. 2022 à 13:56

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 mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
Modifié le 18 nov. 2022 à 17:19

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 mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
18 nov. 2022 à 17:16

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

0