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

Résolu
emrh Messages postés 439 Statut Membre -  
emrh Messages postés 439 Statut Membre -

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

6 réponses

  1. emrh Messages postés 439 Statut Membre 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
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    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
  3. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     

    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
  4. emrh Messages postés 439 Statut Membre 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
    1. emrh Messages postés 439 Statut Membre 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. emrh Messages postés 439 Statut Membre 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
  7. emrh Messages postés 439 Statut Membre 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
    1. emrh Messages postés 439 Statut Membre 20
       

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

      0