Aide sur les array
Résolu
isa--
Messages postés
82
Date d'inscription
Statut
Membre
Dernière intervention
-
isa-- Messages postés 82 Date d'inscription Statut Membre Dernière intervention -
isa-- Messages postés 82 Date d'inscription Statut Membre Dernière intervention -
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
A voir également:
- Aide sur les array
- [C] byte array ✓ - Forum C
- Erreur Array AutoIt ✓ - Forum Autoit / batch
- Problème avec mon $where=array(); ✓ - Forum PHP
- Microphone array ne fonctionne pas ✓ - Forum Windows
- Array javascript vers php - Forum PHP
4 réponses
Là. . Pour le coup... sans voir le reste de ton code....
forum92
Messages postés
220
Date d'inscription
Statut
Membre
Dernière intervention
133
$holidays est déclarée où ? car une variable déclarée dans une fonction reste dans la fonction. Elle n'est pas visible de l'extérieur.
isa--
Messages postés
82
Date d'inscription
Statut
Membre
Dernière intervention
1
>
forum92
Messages postés
220
Date d'inscription
Statut
Membre
Dernière intervention
haha ! Ca me semble une bonne piste de réflexion, en effet...
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 :
Merci de ton aide
Isa
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é.
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 ...
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 ...