Aide sur les array
Résolu
isa--
Messages postés
83
Statut
Membre
-
isa-- Messages postés 83 Statut Membre -
isa-- Messages postés 83 Statut Membre -
Bonjour à tous,
De nouveau besoin d'un petit coup de main..
Peut être me manque t il quelques bases en ce qui concerne les tableaux dans php
Sans vouloir vous saouler avec les lignes de code sans fin, juste pour une première approche de mon problème :
J'ai créé un tableau des jours fériés entre deux dates, pas de souci : $holidays
Pour savoir si chaque jour de cette période est férié ou non, j'utilise :
if (in_array($date, $holidays)) etc...
Et j'obtiens :
Notice: Undefined variable: holidays etc...
Pourtant c'est bien un tableau et il n'est pas vide.
L'un de vous aurait une quelconque idée comme ça à première vue ?
Ou je vous fais voir mon code moche qui jusque là fonctionne bien :-)
Merci d'avance
Isa
De nouveau besoin d'un petit coup de main..
Peut être me manque t il quelques bases en ce qui concerne les tableaux dans php
Sans vouloir vous saouler avec les lignes de code sans fin, juste pour une première approche de mon problème :
J'ai créé un tableau des jours fériés entre deux dates, pas de souci : $holidays
Pour savoir si chaque jour de cette période est férié ou non, j'utilise :
if (in_array($date, $holidays)) etc...
Et j'obtiens :
Notice: Undefined variable: holidays etc...
Pourtant c'est bien un tableau et il n'est pas vide.
L'un de vous aurait une quelconque idée comme ça à première vue ?
Ou je vous fais voir mon code moche qui jusque là fonctionne bien :-)
Merci d'avance
Isa
4 réponses
-
Là. . Pour le coup... sans voir le reste de ton code....
-
Bonjour,
Au risque de me faire gronder (c'est un peu le bordel dans mon code, je ne suis pas encore passée par la période "ranger"), voici mon code :<?php include('./haut.html'); function eachDate3 ($start, $end) { $DateDepart = strtotime($start); $DateFin = strtotime($end); $NombreSecondes = $DateFin - $DateDepart; $NombreJours = $NombreSecondes / (3600*24); $tableau = array(); for($i = 0; $i <= $NombreJours; $i++) { $date = date('Y-m-d', $DateDepart+((3600*24)*$i)+3600); array_push($tableau, $date); } return $tableau; } echo "<div align=\"center\">"; echo "<img src=\"../construction.png\" alt=\"en construction\" width=100><br>"; echo "du mois de <b>"; $mois1=$_POST["mois1"]; switch ($mois1) { case 1: echo "Janvier"; break; case 2: echo "Fevrier"; break; case 3: echo "Mars"; break; case 4: echo "Avril"; break; case 5: echo "Mai"; break; case 6: echo "Juin"; break; case 7: echo "Juillet"; break; case 8: echo "Aout"; break; case 9: echo "Septembre"; break; case 10: echo "Octobre"; break; case 11: echo "Novembre"; break; case 12: echo "Decembre"; break; } echo " "; echo $annee1=$_POST["annee1"]; echo "</b> au mois de <b>"; $mois2=$_POST["mois2"]; $mois2 = preg_replace("/\r|\n/", "", $mois2); switch ($mois2) { case 1: echo "Janvier"; break; case 2: echo "Fevrier"; break; case 3: echo "Mars"; break; case 4: echo "Avril"; break; case 5: echo "Mai"; break; case 6: echo "Juin"; break; case 7: echo "Juillet"; break; case 8: echo "Aout"; break; case 9: echo "Septembre"; break; case 10: echo "Octobre"; break; case 11: echo "Novembre"; break; case 12: echo "Decembre"; break; } echo " "; echo $annee2=$_POST["annee2"]; echo "</b><br>"; // calcul dernier jour dernier mois $datepremierjour=$annee2."-".$mois2."-01"; list($annee, $mois, $jour) = explode('-',$datepremierjour); //recuperation du premier du mois suivant $date_mois_suivant = date("Y/m/d", mktime(0,0,0,$mois2+1,$jour,$annee)); list($annee, $mois2, $jour) = explode('/',$date_mois_suivant); //recuperation de la veille; donc le dernier du jour du mois précédent $end = date("Y-m-d", mktime(0,0,0,$mois2,$jour-1,$annee)); //premier jour $start=$annee1."-".$mois1."-01"; if($start > $end) { return false; } //tableau des conges $debut=strtotime($start); $fin=strtotime($end); $holidays = array(); // On boucle dans le cas où l'année de départ serait différente de l'année d'arrivée $diff_year = date('Y', $fin) - date('Y', $debut); for ($i = 0; $i <= $diff_year; $i++) { $year = (int)date('Y', $debut) + $i; // Liste des jours feriés $holidays[] = $year.'-01-01'; // Jour de l'an $holidays[] = $year.'-05-01'; // Fete du travail $holidays[] = $year.'-05-08'; // Victoire 1945 $holidays[] = $year.'-07-14'; // Fete nationale $holidays[] = $year.'-08-15'; // Assomption $holidays[] = $year.'-11-01'; // Toussaint $holidays[] = $year.'-11-11'; // Armistice 1918 $holidays[] = $year.'-12-25'; // Noel // Récupération de paques. Permet ensuite d'obtenir le jour de l'ascension et celui de la pentecote $easter = easter_date($year); $holidays[] = date($year.'-m-d', $easter + 86400); // Paques $holidays[] = date($year.'-m-d', $easter + (86400*39)); // Ascension $holidays[] = date($year.'-m-d', $easter + (86400*50)); // Pentecote } var_dump($holidays); //constuction des dates echo "<table width=100% border=1 class=\"collapse\">"; // 1ere ligne echo "<tr><th> </th><th> </th>\n"; function eachDate ($start, $end) { $DateDepart = strtotime($start); $DateFin = strtotime($end); $NombreSecondes = $DateFin - $DateDepart; $NombreJours = $NombreSecondes / (3600*24); $ToutesDates = array(); for($i = 0; $i < $NombreJours; $i++) { $date = date('d', $DateDepart+((3600*24)*$i)+3600); array_push($ToutesDates, $date); } return $ToutesDates; } foreach(eachDate($start, $end) as $date) { echo "<th>".$date."</th>\n"; } echo"</tr>"; // deuxième ligne echo "<tr>"; echo "<th>Nom</th>\n<th>Prénom</th>\n"; function eachDate1 ($start, $end) { $DateDepart = strtotime($start); $DateFin = strtotime($end); $NombreSecondes = $DateFin - $DateDepart; $NombreJours = $NombreSecondes / (3600*24); $ToutesDates = array(); for($i = 0; $i < $NombreJours; $i++) { $date = date('D', $DateDepart+((3600*24)*$i)+3600); array_push($ToutesDates, $date); } return $ToutesDates; } foreach(eachDate1($start, $end) as $date) { echo "<th>"; switch ($date) { case "Mon": echo "L"; break; case "Tue": echo "M"; break; case "Wed": echo "M"; break; case "Thu": echo "J"; break; case "Fri": echo "V"; break; case "Sat": echo "S"; break; case "Sun": echo "D"; break; } echo "</th>\n"; } ?> </tr> <?php // rechercher tout le personnel function afficheservice($service){ include('../connexion.php'); $req = "SELECT * FROM `personnel` WHERE `prenom` NOT LIKE 'Emmanuel' and `service` LIKE '$service' ORDER BY service "; $res = $conn->query($req); // pour chaque personne while ($data = mysqli_fetch_array($res)) { echo "<tr><td>"; echo $nom=$data['nom']; echo "</td>\n<td>"; echo $prenom=$data['prenom']; $id=$data['id']; //rechercher les conges de cette personne dans la période $mois1=$_POST["mois1"]; $annee1=$_POST["annee1"]; $start=$annee1."-".$mois1."-01"; //calcul dernier jour dernier mois $mois2=$_POST["mois2"]; $annee2=$_POST["annee2"]; $datepremierjour=$annee2."-".$mois2."-01"; list($annee, $mois, $jour) = explode('-',$datepremierjour); //recuperation du premier du mois suivant $date_mois_suivant = date("Y/m/d", mktime(0,0,0,$mois2+1,$jour,$annee)); list($annee, $mois2, $jour) = explode('/',$date_mois_suivant); //recuperation de la veille; donc le dernier du jour du mois précédent $end = date("Y-m-d", mktime(0,0,0,$mois2,$jour-1,$annee)); include('../connexion.php'); $req2 = "SELECT * FROM `conges` WHERE `id_personnel` LIKE '$id' and `datedebut` <= '$end' and `datefin` >= '$start' "; $res2 = $conn->query($req2); $tableau = array(); // pour chaque personne // contruction du tableau des jours de conges while ($data2 = mysqli_fetch_array($res2)) { $id=$data2['id']; $debutconges=$data2['datedebut']; $finconges=$data2['datefin']; $tableau=array_merge($tableau, eachDate3($debutconges,$finconges)); } // pour chaque jour de la période $DateDepart = strtotime($start); $DateFin = strtotime($end); $NombreSecondes = $DateFin - $DateDepart; $NombreJours = $NombreSecondes / (3600*24); for($i = 0; $i < $NombreJours; $i++) { $date = date('Y-m-d', $DateDepart+((3600*24)*$i)+3600); $weekend = date('D', $DateDepart+((3600*24)*$i)+3600); echo "<td "; // colorer le weekend //echo $date; if ($weekend=="Sun" OR $weekend=="Sat"){ echo " bgcolor=\"lightblue\"";} //colorer les jours féries //var_dump($arr_bank_holidays); //if (in_array($date, $holidays)) { echo "bgcolor=\"red\"";} //date du jour $dujour=date("Y-m-d"); if ($date==$dujour){ echo " style=\"background-image:url(./motif.png);background-repeat:repeat\"";} if (in_array($date, $tableau)) { echo "bgcolor=\"yellow\"> ok";} else {echo ">";} //if ($weekend=="Sun" OR $weekend=="Sat");{ echo " bgcolor=\"lightblue\">";} echo "</td>\n"; } echo "</tr>"; } } $DateDepart = strtotime($start); $DateFin = strtotime($end); $colspan=2+($DateFin-$DateDepart)/86400; afficheservice("COMPTA"); echo "<tr><td colspan="; echo $colspan; echo "> </td></tr>"; afficheservice("ACHATS"); /*echo "<tr><td> </td></tr>"; afficheservice("RH"); echo "<tr><td> </td></tr>"; afficheservice("ADV"); echo "<tr><td> </td></tr>"; afficheservice("MAGASIN"); echo "<tr><td> </td></tr>"; afficheservice("CIAUX"); //contruction du tableau*/ ?>EDIT : Ajout du LANGAGE dans les balises de code (pour avoir la coloration syntaxique ! ) (jordane)
J'arrive à afficher mon tableau $holidays aprés ma boucle ou avant, mais pas dedans..
Merci de ton aide
Isa -
Hello,
Sans avoir regardé en détail ton code ... je pense déjà qu'on peut le réaranger légèrement.
Sachant que le but d'une fonction étant d'être réutilisable.. il ne sert à rien d'en créer plusieurs copies juste pour changer un paramètre...
Donc voici ton code légèrement amélioré.<?php include('./haut.html'); function eachDate3 ($start, $end) { $DateDepart = strtotime($start); $DateFin = strtotime($end); $NombreSecondes = $DateFin - $DateDepart; $NombreJours = $NombreSecondes / (3600*24); $tableau = array(); for($i = 0; $i <= $NombreJours; $i++) { $date = date('Y-m-d', $DateDepart+((3600*24)*$i)+3600); array_push($tableau, $date); } return $tableau; } //retourne le nom du mois en fonction de son numéro function getMoisStr($moisNum = 1){ $arr_mois = array('Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Aôut','Septembre','Octobre','Novembre','Décembre'); return $arr_mois[$moisNum- 1]; } function eachDate($start, $end,$formatRetour = 'd') { $DateDepart = strtotime($start); $DateFin = strtotime($end); $NombreSecondes = $DateFin - $DateDepart; $NombreJours = $NombreSecondes / (3600*24); $ToutesDates = array(); for($i = 0; $i < $NombreJours; $i++) { $date = date($formatRetour, $DateDepart+((3600*24)*$i)+3600); array_push($ToutesDates, $date); } return $ToutesDates; } function afficheservice($service,$annee1,$mois1,$annee2,$mois2){ include('../connexion.php'); $req = "SELECT * FROM `personnel` WHERE `prenom` NOT LIKE 'Emmanuel' and `service` LIKE '$service' ORDER BY service "; $res = $conn->query($req); // pour chaque personne while ($data = mysqli_fetch_array($res)) { echo "<tr><td>"; echo $nom=$data['nom']; echo "</td>\n<td>"; echo $prenom=$data['prenom']; $id=$data['id']; //rechercher les conges de cette personne dans la période $start=$annee1."-".$mois1."-01"; //calcul dernier jour dernier mois $datepremierjour=$annee2."-".$mois2."-01"; list($annee, $mois, $jour) = explode('-',$datepremierjour); //recuperation du premier du mois suivant $date_mois_suivant = date("Y/m/d", mktime(0,0,0,$mois2+1,$jour,$annee)); list($annee, $mois2, $jour) = explode('/',$date_mois_suivant); //recuperation de la veille; donc le dernier du jour du mois précédent $end = date("Y-m-d", mktime(0,0,0,$mois2,$jour-1,$annee)); include('../connexion.php'); $req2 = "SELECT * FROM `conges` WHERE `id_personnel` LIKE '$id' and `datedebut` <= '$end' and `datefin` >= '$start' "; $res2 = $conn->query($req2); $tableau = array(); // pour chaque personne // contruction du tableau des jours de conges while ($data2 = mysqli_fetch_array($res2)) { $id=$data2['id']; $debutconges=$data2['datedebut']; $finconges=$data2['datefin']; $tableau=array_merge($tableau, eachDate3($debutconges,$finconges)); } // pour chaque jour de la période $DateDepart = strtotime($start); $DateFin = strtotime($end); $NombreSecondes = $DateFin - $DateDepart; $NombreJours = $NombreSecondes / (3600*24); for($i = 0; $i < $NombreJours; $i++) { $date = date('Y-m-d', $DateDepart+((3600*24)*$i)+3600); $weekend = date('D', $DateDepart+((3600*24)*$i)+3600); echo "<td "; // colorer le weekend //echo $date; if ($weekend=="Sun" OR $weekend=="Sat"){ echo " bgcolor=\"lightblue\"";} //colorer les jours féries //var_dump($arr_bank_holidays); //if (in_array($date, $holidays)) { echo "bgcolor=\"red\"";} //date du jour $dujour=date("Y-m-d"); if ($date==$dujour){ echo " style=\"background-image:url(./motif.png);background-repeat:repeat\"";} if (in_array($date, $tableau)) { echo "bgcolor=\"yellow\"> ok";} else {echo ">";} //if ($weekend=="Sun" OR $weekend=="Sat");{ echo " bgcolor=\"lightblue\">";} echo "</td>\n"; } echo "</tr>"; } } //--------- VARIABLES ---------// $mois1 = !empty($_POST["mois1"]) ? intval(preg_replace("/\r|\n/", "",$_POST["mois1"])) : date('m'); $mois2 = !empty($_POST["mois2"]) ? intval(preg_replace("/\r|\n/", "",$_POST["mois2"])) : date('m'); $annee1 = !empty($_POST["annee1"]) ? intval($_POST["annee1"]) : date('Y'); $annee2 = !empty($_POST["annee2"]) ? intval($_POST["annee2"]) : date('Y'); echo "<div align=\"center\">"; echo "<img src=\"../construction.png\" alt=\"en construction\" width=100><br>"; echo "du mois de <b>"; echo getMoisStr($mois1); echo " "; echo $annee1; echo "</b> au mois de <b>"; echo getMoisStr($mois2); echo " "; echo $annee2 echo "</b><br>"; // calcul dernier jour dernier mois $datepremierjour=$annee2."-".$mois2."-01"; list($annee, $mois, $jour) = explode('-',$datepremierjour); //recuperation du premier du mois suivant $date_mois_suivant = date("Y/m/d", mktime(0,0,0,$mois2+1,$jour,$annee)); list($annee, $mois2, $jour) = explode('/',$date_mois_suivant); //recuperation de la veille; donc le dernier du jour du mois précédent $end = date("Y-m-d", mktime(0,0,0,$mois2,$jour-1,$annee)); //premier jour $start=$annee1."-".$mois1."-01"; if($start > $end) { return false; } //tableau des conges $debut=strtotime($start); $fin=strtotime($end); $holidays = array(); // On boucle dans le cas où l'année de départ serait différente de l'année d'arrivée $diff_year = date('Y', $fin) - date('Y', $debut); for ($i = 0; $i <= $diff_year; $i++) { $year = (int)date('Y', $debut) + $i; // Liste des jours feriés $holidays[] = $year.'-01-01'; // Jour de l'an $holidays[] = $year.'-05-01'; // Fete du travail $holidays[] = $year.'-05-08'; // Victoire 1945 $holidays[] = $year.'-07-14'; // Fete nationale $holidays[] = $year.'-08-15'; // Assomption $holidays[] = $year.'-11-01'; // Toussaint $holidays[] = $year.'-11-11'; // Armistice 1918 $holidays[] = $year.'-12-25'; // Noel // Récupération de paques. Permet ensuite d'obtenir le jour de l'ascension et celui de la pentecote $easter = easter_date($year); $holidays[] = date($year.'-m-d', $easter + 86400); // Paques $holidays[] = date($year.'-m-d', $easter + (86400*39)); // Ascension $holidays[] = date($year.'-m-d', $easter + (86400*50)); // Pentecote } var_dump($holidays); //constuction des dates echo "<table width=100% border=1 class=\"collapse\">"; // 1ere ligne echo "<tr><th> </th><th> </th>\n"; foreach(eachDate($start, $end , 'd') as $date) { echo "<th>".$date."</th>\n"; } echo"</tr>"; // deuxième ligne echo "<tr>"; echo "<th>Nom</th>\n<th>Prénom</th>\n"; foreach(eachDate($start, $end , 'D') as $date) { echo "<th>"; switch ($date) { case "Mon": echo "L"; break; case "Tue": echo "M"; break; case "Wed": echo "M"; break; case "Thu": echo "J"; break; case "Fri": echo "V"; break; case "Sat": echo "S"; break; case "Sun": echo "D"; break; } echo "</th>\n"; } ?> </tr> <?php // rechercher tout le personnel $DateDepart = strtotime($start); $DateFin = strtotime($end); $colspan=2+($DateFin-$DateDepart)/86400; afficheservice("COMPTA",$annee1,$mois1,$annee2,$mois2) echo "<tr><td colspan="; echo $colspan; echo "> </td></tr>"; afficheservice("ACHATS",$annee1,$mois1,$annee2,$mois2) /*echo "<tr><td> </td></tr>"; afficheservice("RH"); echo "<tr><td> </td></tr>"; afficheservice("ADV"); echo "<tr><td> </td></tr>"; afficheservice("MAGASIN"); echo "<tr><td> </td></tr>"; afficheservice("CIAUX"); //contruction du tableau*/ ?>
NB : La fonction afficheservice mériterait d'être revue pour être mieux découpée et améliorée... mais là .. j'ai la flemme.
je te laisse faire.....
NB² : On n'évite d'utiliser les variables POST dans des fonctions. A la place, on enverra les valeurs en les passant en paramétres des fonctions.
NB3 : On regroupe les fonctions ensemble au lieu de les disséminer au milieu du code en vrac ...
-
Bonjour à tous,
Après un bon coup de ménage dans mon code (genre ne pas utiliser 20 fois le même nom de variable), et grâce à vos conseil avisés, ça fonctionne et c'est plus propre.
Mille merci à tous pour vos avis et votre indulgence.
Bonne journée