Et également retour sur le TP2
C'est un moyen simple de passer en revue un tableau Deux syntaxes À chaque itération, la valeur de l'élément courant est assignée à $value et le pointeur interne à la liste (tableau) est avancé d'un élément ce qui fait qu'à la prochaine itération, on accédera à l'élément suivant. foreach ($tableau as $value) { /* $value prend successivement toutes les valeurs contenues dans $tableau toutes les instructions faites dans ce bloc sont exécutées pour chaque valeur */ Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 02 / 37
foreach ($tableau as $clef => $valeur) { /* $valeur prend successivement toutes les valeurs contenues dans $tableau. Dans le même temps, $clef correspond à l indice (ou la clef) de cette valeur dans le tableau. Toutes les instructions faites dans ce bloc sont exécutées pour chaque couple (clef, valeur) */ Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 03 / 37
$liste = glob("news/politique/*.news"); /* $liste contient 5 éléménts, 01.news, 02.news,, 05.news */ foreach ($liste as $indice => $f) { /* Il y aura 5 itérations, car il y a 5 éléments les couples ($indice, $f) seront successivement : (0, "news/politique/01.news") (1, "news/politique/02.news") (2, "news/politique/03.news") (3, "news/politique/04.news") (4, "news/politique/05.news") */ Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 04 / 37
Exécute une itération à chaque passage de la boucle Itération sur les indices Ou pour «n» itérations Il faut préciser: l initialisation du compteur d itération On peut commencer à 0; à 2; etc.. Attention à la plage des indices d un tableau la condition d arrêt de la boucle; Limite supérieur si le compteur augmente Limite inférieur si le compteur diminue la ou les instructions faisant évoluer ces valeurs à chaque itération $longeur=count($tab); for ($a=0,$a<$longueur; $a = $a+1) { echo $tab[$a] ; Boucles équivalentes for ($x=0; $x <10; $x++) { // Ici des instructions foreach($tab as $case) { echo $case; Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 05 / 37
// lecture d un fichier $lecture_fichier = file("news/politique/01.news"); $nb_lignes = count($lecture_fichier); $contenu_article = ""; /* exemple de boucle à rebours il faut faire bien attention au test de fin et à l évolution de la variable d itération */ for($cpt = $nb_lignes; $cpt >= 2; $cpt--) { /* on inverse le contenu du fichier */ /* en ne gardant pas les 2re lignes */ $contenu_article.= $lecture_fichier[$cpt]; Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 06 / 37
Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 07 / 37
Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 08 / 37
Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 09 / 37
Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 10 / 37
Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 11 / 37
$precedent initialisé à "" Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 12 / 37
Comment écrire nos propres fonctions en php. Premier pas vers une architecture logicielle. Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 13 / 37
Exemple de code répété dans le tp02 $nomarticle = explode("/",$fichiers[$indice]); $nomarticle = $nomarticle[count($nomarticle)- 1]; Besoin de mettre en commun Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 14 / 37
Définition : Les fonctions en PHP doivent être définies avant leur appel. Le nom d une fonction ne commence pas par $, et n est pas sensible à l utilisation des majuscules/minuscules. Voici la syntaxe : function nom($chemin) { $fichier = explode("/",$chemin); $fichier = $fichier[count($fichier)-1]; return $fichier; Toutes les fonctions en PHP ont une portée globale Les variables à l intérieur des fonctions ont une portée locale La récursivité est possible Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 15 / 37
par valeur : Les arguments sont passés généralement par valeur, ce qui signifie qu une copie des variables est faite au moment de l appel de la fonction, et que les éventuelles modifications faites dans le corps de la fonction sur les arguments n ont qu un effet local. i.e., une fois la fonction terminée, les modifications sont «oubliées» par adresse (non abordé ici) Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 16 / 37
Valeurs par défaut pour un ou plusieurs arguments d une fonction. La valeur par défaut d'un argument doit obligatoirement être une constante, et ne peut être ni une variable, ni un membre de classe, ni un appel de fonction. Il est à noter que si vous utilisez des arguments avec valeur par défaut avec d'autres sans valeur par défaut, ceux avec une valeur par défaut doivent être à la fin. function Connexion ($pnom, $pmotpass, $pbase = "clubvideo", $pserveur = "toto") { // Ici le code de la fonction // on peut donc appeler cette fonction sans citer les deux derniers arguments $connexion1 = Connexion ("dupond", "passdupond"); $connexion2 = Connexion ("dupont", "passdupont", "Films"); Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 17 / 37
les fonctions sont à nombre d'arguments variable. Possible avec les fonctions suivantes : func_num_args( ) [pas de paramètre, retourne le nombre d'arguments passés à la fonction], func_get_arg( ) [un paremètre i : retourne le (i+1)ième élément de la liste des arguments] et func_get_args( ) [pas de paramètre, retourne les arguments d'une fonction sous forme de tableau] Fonctions et variables : PHP propose trois types de variables (la même terminologie du C) : Variables automatiques (pas de portée à l extérieur) Variables statiques ( persistantes entre les appels) Variables globales (mot clef «global») Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 18 / 37
Les valeurs de retour Les valeurs sont renvoyées en utilisant une instruction de retour optionnelle. Tous les types de variables peuvent être renvoyés, tableaux et objets compris. Cela fait que la fonction finit son exécution immédiatement et passe le contrôle à la ligne appelante. c.f. return( ) function mafonction() { //. return $unresultat; $resultat = mafonction(); Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 19 / 37
Si appelée depuis une fonction, la commande return termine immédiatement la fonction, et retourne l'argument qui lui est passé. Si appelée depuis l'environnement global, l'exécution du script est interrompue. Si le script courant était include( ) ou require( ), alors le contrôle est rendu au script appelant, et la valeur retournée sera utilisée comme résultat de la fonction include( ). Si return( ) est appelée depuis le script principal, alors l'exécution du script s'arrête. Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 20 / 37
TP01 : calcul depuis la rentrée et jusqu à l été Deux parties de code très ressemblante Démarche : Identification du code commun (conception) Factorisation Amélioration (partagée) Partage entre fichier Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 21 / 37
En principes pour les jours, les heures, les minutes et les secondes Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 22 / 37
Pour les séquences identifiées, il faut identifier Ce qui les distingue : variables externes Variables en entrée => les paramètres des fonctions La date de référence, mais sous quel format? now? Ce qu elles produisent Quel résultat à la fonction Un paragraphe Ce qui les sépare : généralisation du code Déterminer les «structures de contrôles» (if, ) Est-ce avant ou après? Il ne reste qu à trouver un nom à la fonction Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 23 / 37
function calculedelai($datereference) { $resultat = ""; $date = strtotime($datereference); $diff = $date-strtotime("now"); if ($diff < 0) { // c'est avant else { // c'est apres return $resultat; Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 24 / 37
Production si la date est avant Il s'est passé 20 jours, 11 heures, 1 minute et 41 secondes depuis le 07 September 2015 Production si la date est après Il reste 164 jours, 11 heures, 48 minutes et 59 secondes avant le 21 June 2016 Calculs similaires (mais attention au signe) Début qui change et la préposition (avant / depuis) Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 25 / 37
/** différence entre maintenant et le 21/06/2016 **/ /** qui est censé être dans le futur **/ $tempsrestant = calculedelai("2016-06-21"); /** calcul pour le temps écoulé depuis la rentrée **/ /** paragraphe affichant le résultat **/ $tempsrestant.= calculedelai("2015-09-07"); /** calcul avec maintenant. **/ /** paragraphe affichant le résultat **/ $tempsrestant.= calculedelai("now"); /** demonstration live : changement de date **/ Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 26 / 37
// en paramètre : une chaine de caractère de type 2016-06-21 function calculedelai($datereference) { $resultat = ""; $date = strtotime($datereference); $diff = $date-strtotime("now"); $debut = "Il reste"; $preposition = "avant"; if ($diff < 0) { // c'est avant // on change le début du message et la préposition $debut = "Il s'est passé"; $preposition = "depuis"; // on inverse le signe, pas de soucis d'arrondi $diff = -$diff; /* else { // c'est apres // rien à faire car les valeurs initiales correspondent à ce cas */ /* suite au transparent suivant */ Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 27 / 37
// suite de function calculedelai($datereference) { $restes = $diff; /** calcul du nombre de jours **/ $restej = floor($ $restes / 86400 ); // on peut remplacer 86400 par 60*60*24 $restes = $diff - $restej*86400; /** calcul du nombre d'heures **/ $resteh = floor($restes / (3600) ); // on peut remplacer 3600 par 60*60 $restes = $restes - $resteh*(3600); /** calcul du nombre de minutes et de secondes **/ $restem = floor($restes / 60 ); $restes = $restes - $restem*60; /** paragraphe affichant le résultat **/ $resultat = "<p>$debut ".$restej." jours, $resteh heures,"; $resultat.= "$restem minutes et ".$restes." secondes $preposition le "; $resultat.= date("d F Y", $date)." </p>"; return $resultat; Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 28 / 37
Possibilité d automatiser le traitement Un même motif se répète : le calcul (division, arrondi, reste), y compris dans la construction du paragraphe Regrouper les informations dans une structure pour un traitement identique Ce qui est invariant : Plusieurs informations : le diviseur (nombre de seconde) Le nom (jour, heure, etc.) Ce qui est calculé Le calcul lui-même, La marque du pluriel, la séparation Objectif : pouvoir faire évoluer plus facilement Ajouter de l information (le nombre d année? ) En retirer (ne plus voir les secondes) Etc. Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 29 / 37
$restes = $diff; // pb : plusieurs tableau avec les mêmes indices... // ce qui est invariant // tous les tableaux font la même taille, ici 4 $noms = array("jour", "heure", "minute", " seconde"); $nbsec = array(86400, 3600, 60, 1); $nbinfo = count($noms); // ce qui est variant (avec initialisation - optionnelle) $pluriels = array( "", "", "", ""); $liaisons = array("", ",", ",", " et"); $calcul = array(0,0,0,0); // pour gérer les cas ou le calcul vaut 0 $derniere_valeur = -1; Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 30 / 37
// calcul des valeurs for($i = 0; $i < $nbinfo; $i=$i+1) { $calcul[$i] = floor($restes / $nbsec[$i] ); $restes = $restes - $calcul[$i]*($nbsec[$i]); // on determine le pluriel if ($calcul[$i] > 1) $pluriels[$i] = "s"; // on change la liaison if ($calcul[$i] >= 1) { if ($derniere_valeur < 0) $liaisons[$i] = ""; else $liaisons[$i] = ","; $derniere_valeur = $i; Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 31 / 37
// si la date est maintenant? if ($derniere_valeur == -1) { else { $resultat = "<p>c'est maintenant le ".date("d F Y", $date)."!</p>"; // on enleve la derniere, if ($liaisons[$derniere_valeur] == ",") { $liaisons[$derniere_valeur] = " et"; /** paragraphe affichant le résultat **/ $resultat = "<p>$debut "; for($i = 0; $i < $nbinfo; $i=$i+1) { if ($calcul[$i] > 0) { $resultat.= "{$liaisons[$i] {$calcul[$i] {$noms[$i]{$pluriels[$i]"; // on termine le paragraphe $resultat.= " $preposition le ".date("d F Y", $date)."</p>"; // fin de la fonction... return $resultat; Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 32 / 37
Appel à calculedelai("2019-06- 21"); 3 points d arrêt : - Test avant/après - Dans la boucle (plusieurs fois) - En sortie de boucle Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 33 / 37
Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 34 / 37
Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 35 / 37
Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 36 / 37
/** différence entre maintenant et le 21/06/2013 **/ /** qui est censé être dans le futur **/ $tempsrestant = calculedelai("2014-06-21"); /** calcul pour le temps écoulé depuis la rentrée **/ /** paragraphe affichant le résultat **/ $tempsrestant.= calculedelai("2013-09-09"); /** calcul avec maintenant. **/ /** paragraphe affichant le résultat **/ $tempsrestant.= calculedelai("now"); /** demonstration : changement de date, d année, **/ /** d information à afficher, etc. **/ Philippe Renevier Gonin - boucle foreach/for et fonctions - Prog Web Serveur 37 / 37