Aide sur les array

Résolu/Fermé
isa-- Messages postés 77 Date d'inscription lundi 16 septembre 2013 Statut Membre Dernière intervention 11 mars 2020 - 20 oct. 2017 à 16:38
isa-- Messages postés 77 Date d'inscription lundi 16 septembre 2013 Statut Membre Dernière intervention 11 mars 2020 - 26 oct. 2017 à 07:27
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



4 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
20 oct. 2017 à 19:09
Là. . Pour le coup... sans voir le reste de ton code....
0
forum92 Messages postés 220 Date d'inscription lundi 6 juillet 2015 Statut Membre Dernière intervention 14 août 2018 133
21 oct. 2017 à 20:58
$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.
0
isa-- Messages postés 77 Date d'inscription lundi 16 septembre 2013 Statut Membre Dernière intervention 11 mars 2020 1 > forum92 Messages postés 220 Date d'inscription lundi 6 juillet 2015 Statut Membre Dernière intervention 14 août 2018
23 oct. 2017 à 11:44
haha ! Ca me semble une bonne piste de réflexion, en effet...
0
isa-- Messages postés 77 Date d'inscription lundi 16 septembre 2013 Statut Membre Dernière intervention 11 mars 2020 1
Modifié le 23 oct. 2017 à 13:49
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
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
23 oct. 2017 à 14:58
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 ...


0
isa-- Messages postés 77 Date d'inscription lundi 16 septembre 2013 Statut Membre Dernière intervention 11 mars 2020 1
23 oct. 2017 à 21:22
Oui, en effet, ça méritait un peu de ménage...
J'avais tout fait un peu à l'arrache et c'était un peu brouillon.
Merci de t'être penchée sur mon problème.
Je vais regarder ce que tu as fait de plus près et en prendre de la graine.
Je teste et je reviens dire si c'est résolu.
Merci encore.
0
isa-- Messages postés 77 Date d'inscription lundi 16 septembre 2013 Statut Membre Dernière intervention 11 mars 2020 1
26 oct. 2017 à 07:27
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
0