Boucle for avec comparaison de 1,2,3 avec des 01,02,03
Résoluemrh 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
-
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>'; } } -
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 ASCensuite,
'jour' => $data['jour']
-
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']) ){
-
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)
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 ! -
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