Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Structure de données en PHP

9,062 views

Published on

Présentation des structures de données en PHP et des diverses formes d'utilisation.

Published in: Technology
  • c bient
    &
    merciiii pour votre information
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Structure de données en PHP

  1. 1. Les structures de données <ul><ul><li>Jean-Marie Renouard </li></ul></ul><ul><ul><li>http://www.jmrenouard.fr </li></ul></ul>
  2. 2. A propos <ul><li>Ce slide est offert à but non commercial </li></ul><ul><li>Jean-Marie Renouard </li></ul><ul><li>http://www.jmrenouard.fr </li></ul><ul><li>Conseil et formation en technologie Web </li></ul>
  3. 3. Les structure de données <ul><li>Les tableaux à index </li></ul><ul><li>Parcours par copie </li></ul><ul><li>Parcours par référence </li></ul><ul><li>Les tableaux à clé/valeur </li></ul><ul><li>Les tableaux multidimensionnels </li></ul><ul><li>Les tableaux de référence </li></ul><ul><li>Les parcours de tableaux </li></ul><ul><li>Opérations sur tableau </li></ul><ul><li>Les ruptures de parcours </li></ul>
  4. 4. Quelques principes en PHP <ul><li>Tout peut servir de valeur comme élément d’un tableau. </li></ul><ul><li>Il est possible de mettre des éléments hétérogènes ( tableau, entier, chaîne,..) dans un même tableau. </li></ul><ul><li>Principe de clé/valeur </li></ul><ul><li>Nombreuses fonctions de gestion des tableaux. </li></ul>
  5. 5. Les tableaux à index
  6. 6. for <ul><li>Raccourci d'expression while </li></ul><ul><li>for (expr1; expr2; expr3) {...} </li></ul><ul><li>Peut être traduit par : </li></ul><ul><ul><ul><li>expr1; </li></ul></ul></ul><ul><ul><ul><li>while (expr2) { </li></ul></ul></ul><ul><ul><ul><li>... </li></ul></ul></ul><ul><ul><ul><li>expr3; } </li></ul></ul></ul>
  7. 7. Foreach avec tableau à index <ul><li>Boucle de parcours de tableau : foreach </li></ul><ul><li>Exemple avec des tableaux à index : </li></ul><ul><ul><li>$arr = array(1, 2, 3, 4); </li></ul></ul><ul><ul><li>$i=0; </li></ul></ul><ul><ul><li>foreach ($arr as $value) { </li></ul></ul><ul><ul><li>echo “$arr[“.$i.”]=“.$value; </li></ul></ul><ul><ul><li>$i++; </li></ul></ul><ul><ul><li>} </li></ul></ul>
  8. 8. For avec tableau à index <ul><li>Boucle de parcours de tableau : for </li></ul><ul><li>Exemple avec des tableaux à index : </li></ul><ul><ul><li>$arr = array(1, 2, 3, 4); </li></ul></ul><ul><ul><li>for($i=0;$i<count($arr);$i++) { </li></ul></ul><ul><ul><li>echo “$arr[“.$i.”]=“.$arr[$i]; </li></ul></ul><ul><ul><li>} </li></ul></ul>
  9. 9. Foreach avec tableau à index <ul><li>Boucle de parcours par référence </li></ul><ul><li>Exemple de modification de tous les éléments: </li></ul><ul><ul><li>$arr = array(1, 2, 3, 4); </li></ul></ul><ul><ul><li>foreach ($arr as &$value) { </li></ul></ul><ul><ul><li>$value = $value * 2; </li></ul></ul><ul><ul><li>} </li></ul></ul>
  10. 10. Exemples <ul><li>C5tableaux/tableau5.php </li></ul><ul><li>C5tableaux/tableau7.php </li></ul><ul><li>C5tableaux/tableau11.php </li></ul>
  11. 11. Les tableaux à clé/valeur
  12. 12. Les clés <ul><li>2 types de clés possibles: </li></ul><ul><ul><li>Entier : tableau à index </li></ul></ul><ul><ul><li>Chaîne de caractère: clé d’index. </li></ul></ul><ul><li>La clé est unique dans le tableau </li></ul><ul><li>Il ne peut y avoir 2 valeurs pour une même clé. </li></ul><ul><li>L’unique point d’entrée vers une valeur unique. </li></ul>
  13. 13. Fonctions des clés <ul><li>Array_keys() : renvoie un tableau des clés </li></ul><ul><li>Array_key_exists(): indique si la clé est présente. </li></ul><ul><li>key(): renvoie la clé courante </li></ul>
  14. 14. Foreach avec tableau à clé <ul><li>Boucle de parcours de tableau </li></ul><ul><li>Exemple avec des tableaux à clé : </li></ul><ul><ul><li>$tab = array (&quot;un&quot; => 1, &quot;deux&quot; => 2 </li></ul></ul><ul><ul><ul><li>&quot;trois&quot; => 3, &quot;dix-sept&quot; => 17 ); </li></ul></ul></ul><ul><ul><li>foreach ($tab as $cle => $val) { </li></ul></ul><ul><ul><li>echo &quot;$tab[$cle] => $val.n&quot;; </li></ul></ul><ul><ul><li>} </li></ul></ul>
  15. 15. Foreach avec tableau à clé <ul><li>Boucle de parcours par référence </li></ul><ul><li>Exemple avec des tableaux à clé : </li></ul><ul><ul><li>$tab = array (&quot;un&quot; => 1, &quot;deux&quot; => 2 </li></ul></ul><ul><ul><ul><li>&quot;trois&quot; => 3, &quot;dix-sept&quot; => 17 ); </li></ul></ul></ul><ul><ul><li>foreach ($tab as $cle => &$val) { </li></ul></ul><ul><ul><li>$val*=2; </li></ul></ul><ul><ul><li>} </li></ul></ul>
  16. 16. Les tableaux multi-dimensionnelles
  17. 17. Les tableaux multi-dimensionnelles <ul><li>Tableau contenant des tableaux </li></ul><ul><ul><li>Résultat de recherche en base de données </li></ul></ul><ul><ul><ul><li>Dimension 1: les lignes de résultat </li></ul></ul></ul><ul><ul><ul><li>Dimension 2: les n-uplets de valeur de tableaux </li></ul></ul></ul><ul><ul><li>Classement de données par tags ou label </li></ul></ul>
  18. 18. Table SQL: tableau multidim.
  19. 19. Traitements récursifs <ul><li>Traitement récursif: </li></ul><ul><ul><li>Appel d’une fonction à elle-même pour traiter les sous éléments. </li></ul></ul><ul><li>Exemples: </li></ul><ul><ul><li>Traitement de tous les éléments d’un tableau </li></ul></ul><ul><ul><li>Comptage </li></ul></ul><ul><ul><li>Recherche d’élément en profondeur </li></ul></ul><ul><ul><li>Sérialisation de données </li></ul></ul>
  20. 20. Exemples: comptage d’élément <ul><li>function deepCount(&$tab) { </li></ul><ul><li>$nb_val=0; </li></ul><ul><li>for ($i=0;$i<count($tab);$i++) { </li></ul><ul><li>if(gettype($tab [$i])==&quot;array&quot;) { $nb_val+=deepCount(&$tab[$i]); </li></ul><ul><li>} else { $nb_val++; } </li></ul><ul><li>} </li></ul><ul><li>return nb_val; </li></ul><ul><li>} </li></ul>
  21. 21. Exemple: <ul><li>C5tableaux/tableau1.php </li></ul><ul><li>C5tableaux/tableau6.php </li></ul>
  22. 22. Les tableaux de référence
  23. 23. Les tableaux de référence <ul><li>Possibilité de parcours par référence </li></ul><ul><ul><li>foreach ($tab as $cle => &$val) { $val*=2; } </li></ul></ul><ul><li>Possibilité de stocker des références </li></ul><ul><li>$chaine=« toto »; </li></ul><ul><li>$tab[]=&$chaine; </li></ul><ul><li>$chaine et $tab[0] sont maintenant liés. </li></ul>
  24. 24. Les parcours de tableau
  25. 25. Les 4 techniques de parcours <ul><li>2 techniques par itération. </li></ul><ul><ul><li>Directive :Foreach </li></ul></ul><ul><ul><li>Directive : For </li></ul></ul><ul><li>2 techniques par navigation/position. </li></ul><ul><ul><li>Directive : Each/list </li></ul></ul><ul><ul><li>Directive : Current/next </li></ul></ul>
  26. 26. Technique de parcours: foreach <ul><li>Parcours par copie </li></ul><ul><ul><li>foreach ($tab as $cle => $val) { echo $val; } </li></ul></ul><ul><li>Parcours par référence </li></ul><ul><li>foreach ($tab as $cle => &$val) { $val*=2; } </li></ul><ul><li>La plus utilisée. </li></ul>
  27. 27. Technique de parcours: for <ul><li>Il s’agit de boucler sur le tableau des clés. </li></ul><ul><li>$cles=array_keys($tab); </li></ul><ul><li>for ($i=0;$i<count($cles);$i++) { </li></ul><ul><li>$cle= $cles[$i]; </li></ul><ul><ul><li>echo « n * tab [» .$cle. »]=« .$tab[$cle]; </li></ul></ul><ul><ul><li>} </li></ul></ul>
  28. 28. Technique de parcours: Each <ul><li>List / each: fonctions de parcours </li></ul><ul><li>$tab=array( </li></ul><ul><li>&quot;France&quot;=>&quot;Paris&quot;, </li></ul><ul><li>&quot;Great Britain&quot;=>&quot;London&quot;, </li></ul><ul><li>&quot;Belgique&quot;=>&quot;Brüssel&quot;); </li></ul><ul><li>while(list($cle,$valeur) = each($tab) ) { </li></ul><ul><li>echo &quot;clé <b>$cle</b> / valeur <b>$valeur</b> <br>&quot;; </li></ul><ul><li>} </li></ul>
  29. 29. Technique de parcour: Current <ul><li>current/ key/next/ reset: fonctions de parcours </li></ul><ul><li>$tab=array( </li></ul><ul><li>&quot;France&quot;=>&quot;Paris&quot;, </li></ul><ul><li>&quot;Great Britain&quot;=>&quot;London&quot;, </li></ul><ul><li>&quot;Belgique&quot;=>&quot;Brüssel&quot;); </li></ul><ul><li>reset($tab); </li></ul><ul><li>while( $val = current($tab) ) { </li></ul><ul><li>echo &quot;L'élément de clé <b>&quot;.key($tab). </li></ul><ul><li>&quot;</b> a la valeur <b>$val</b> <br>&quot;; </li></ul><ul><li>next($tab); </li></ul><ul><li>} </li></ul>
  30. 30. Les manipulations des tableaux
  31. 31. Opérations possibles <ul><li>Affichage d’un tableau </li></ul><ul><li>Insertion et Insertion à la position </li></ul><ul><li>Découpe en sous-tableau </li></ul><ul><li>Tronçonnage d’un tableau </li></ul><ul><li>Calcul des différences, intersections et fusion </li></ul><ul><li>Recherches diverses </li></ul><ul><li>Manipulation de tous les éléments </li></ul><ul><li>Renversement, mélange et recherche aléatoire </li></ul><ul><li>Inversement clé/valeur </li></ul><ul><li>Remplacement de valeur </li></ul><ul><li>Tri multi-tableau </li></ul>
  32. 32. Affichage d’un tableau <ul><li>var_dump: affiche le contenu </li></ul><ul><li>print_r: idem </li></ul><ul><ul><li>2 ème paramètre: true => renvoie la chaîne de caractère </li></ul></ul><ul><li>var_export: idem </li></ul><ul><ul><li>2 ème paramètre: true => renvoie la chaîne de caractère </li></ul></ul><ul><li>serialize: sérialise en texte une variable </li></ul>
  33. 33. Découpe en sous-tableau <ul><li>array_slice( $tab, indice_debut, taille); </li></ul><ul><li>Dépoupage dans le tableau $tab </li></ul><ul><li>A partir de l’indice $indice_debut </li></ul><ul><li>Un sous-tableau de taille taille. </li></ul><ul><li>Ne pas confondre avec array_splice </li></ul>
  34. 34. Découpe en sous-tableau <ul><li>Découpage les 2 premiers éléments </li></ul><ul><ul><li>array_splice( $tab, indice); </li></ul></ul><ul><li>Dépoupage des 2 derniers éléments </li></ul><ul><ul><li>array_splice( $tab, indice, -indice); </li></ul></ul>
  35. 35. Tronçonnage d’un tableau <ul><li>array_chunk(tab, size) </li></ul><ul><li>Renvoie un tableau de sous tableau de taille size contenant le contenu de tab </li></ul><ul><li>3 ème paramètre: réinitialise l’indice des éléments de chaque tableau </li></ul>
  36. 36. Insertions de données <ul><li>Insertion à la fin: </li></ul><ul><ul><li>$tab[]=$nouveau_element; </li></ul></ul><ul><ul><li>array_push($tab, $nouveau_element); </li></ul></ul><ul><li>Insertion au début: </li></ul><ul><ul><li>Array_unshift($tab, $nouveau_element); </li></ul></ul><ul><li>Array_pop / array_shift: dépiler le tableau </li></ul>
  37. 37. Création de tableau <ul><li>Création d’un tableau à clé à partir 2 tableaux: </li></ul><ul><ul><li>array_combine($tab_clé, $tab_valeur); </li></ul></ul><ul><li>Remplissage de tableau unique: </li></ul><ul><ul><li>Array_fill($tab, indice, taille, valeur) </li></ul></ul><ul><li>Remplissage de tableau de valeur entière </li></ul><ul><ul><li>range(1,100) </li></ul></ul><ul><li>Remplissage de tableau </li></ul><ul><ul><li>array_pad($tab, taille, valeur par défaut) </li></ul></ul>
  38. 38. Insertion à la position <ul><li>Insérer un élément à une position donnée </li></ul><ul><li>function insert_in_array_pos($array, $pos, $value) {   $result = array_merge(array_slice($array, 0 , $pos), array($value), array_slice($array,  $pos));   return $result; } </li></ul><ul><li>Autres solutions: </li></ul><ul><li>array_splice($array, $pos, 0, $value); </li></ul>
  39. 39. Calcul sur les ensembles <ul><li>array_intersect ($tab1, $tab2) : intersection </li></ul><ul><li>array_diff($tab1, $tab2) : différence en bleu </li></ul><ul><li>array_merge ($tab1, $tab2) : la fusion(E) </li></ul>
  40. 40. Recherches diverses <ul><li>Recherche de la clé à partir de la valeur. </li></ul><ul><ul><li>$cle=array_search($valeur, $tab); </li></ul></ul><ul><li>Filtrage et sélection à tous les éléments: </li></ul><ul><ul><li>array_filter( $tab, $cb_fonction); </li></ul></ul><ul><li>Recherche de clé: </li></ul><ul><ul><li>array_key_exists($clé, $tab) </li></ul></ul><ul><li>Recherche de valeur </li></ul><ul><ul><li>in_array($val, $tab) </li></ul></ul>
  41. 41. Manipulation de tous les éléments <ul><li>Exécution de la fonction sur chaque éléments </li></ul><ul><li>Renvoi du tableau résultat </li></ul><ul><li>Array_map($cb_function, $tab, $param) </li></ul><ul><li>Application d’une fonction sur chaque élément </li></ul><ul><ul><li>Array_walk($tab, $cb_function); </li></ul></ul>
  42. 42. Renversement et recherche aléatoire <ul><li>Inversion d’un tableau: </li></ul><ul><ul><li>Array_reverse($tab); </li></ul></ul><ul><li>Mélange d’un tableau </li></ul><ul><ul><li>Array_shuffle($tab); </li></ul></ul><ul><li>Tirage au sort aléatoire dans un tableau </li></ul><ul><ul><li>Array_rand($tab); </li></ul></ul>
  43. 43. Inversement clé/valeur <ul><li>Array_flip($tab) </li></ul><ul><li>La clé deviennent les valeurs. </li></ul><ul><li>Les valeurs deviennent les clés </li></ul><ul><li>Seule la dernière valeur fait office de clé final. </li></ul>
  44. 44. Remplacement de valeur <ul><li>Réduire un tableau à une valeur </li></ul><ul><ul><li>Array_reduce($tab, $cb_function, $initValeur); </li></ul></ul><ul><li>Remplacement de valeur </li></ul><ul><ul><li>Array_replace($tab, $rempTab1, …) </li></ul></ul><ul><li>Remplacement de valeur récursivement </li></ul><ul><ul><li>Array_replace_recurcive($tab, $rempTab1, …) </li></ul></ul>
  45. 45. Tris divers <ul><li>Tri de clé: ksort($tab) </li></ul><ul><li>Tri par valeur: sort($tab) </li></ul><ul><li>Tri inverse par valeur: rsort($tab) </li></ul><ul><li>Tri inverse par clé: rksort($tab) </li></ul><ul><li>Tri des éléments uniques: </li></ul><ul><ul><li>array_unique($tab) </li></ul></ul><ul><li>Multitris </li></ul><ul><ul><li>Array_multisort($tab, $opt, $tab1, …) </li></ul></ul>
  46. 46. Tableau à index <ul><li>Remplissage : array_fill() </li></ul><ul><li>Somme : array_sum() </li></ul><ul><li>Différence : array_diff() </li></ul><ul><li>Intersection : array_intersect() </li></ul><ul><li>Union : array_push() </li></ul><ul><li>Application de fonction : array_walk() </li></ul><ul><li>Filtrage : array_filter() </li></ul>
  47. 47. Tableau à index <ul><li>Renversemment des valeurs : array_reverse() </li></ul><ul><li>Mélange d'élément : array_shuffle() </li></ul><ul><li>Recherche d'élément : in_array() </li></ul><ul><li>Dédoublonnage de valeurs : array_unique() </li></ul><ul><li>Découpage de portion : array_splice() </li></ul><ul><li>Découpage en sous-tableau: array_chunk() </li></ul><ul><li>Découpage de chaîne : explode() </li></ul><ul><li>Fusion d'un tableau : implode() </li></ul>
  48. 48. Les ruptures de parcours
  49. 49. Rupture de parcours <ul><li>Instructions d'altération de boucle </li></ul><ul><li>Il est parfois nécessaire d’arrêter une boucle. </li></ul><ul><li>2 instructions majeures: break et continue </li></ul><ul><li>Cassure de boucle: for, foreach ou while </li></ul><ul><li>Rupture de la 1 ère boucle courante. </li></ul><ul><li>Pas de propagation aux autres boucles. </li></ul>
  50. 50. Exemple <ul><li>Soit le tableau des comptes des enfants: </li></ul><ul><li>$tab= array ( </li></ul><ul><ul><li>&quot;Pierre&quot; => array (&quot;age&quot;=> 18, &quot;montant&quot;=>100), </li></ul></ul><ul><ul><li>&quot;Louis&quot; => array (&quot;age&quot;=> 10, &quot;montant&quot;=>50), </li></ul></ul><ul><ul><li>&quot;Benjamin&quot; => array (&quot;age&quot;=> 20, &quot;montant&quot;=>200), </li></ul></ul><ul><ul><li>&quot;Luc&quot; => array (&quot;age&quot;=> 25, &quot;montant&quot;=>550), </li></ul></ul><ul><ul><li>&quot;Marc&quot; => array (&quot;age&quot;=> 8, &quot;montant&quot;=>30), </li></ul></ul><ul><li>); </li></ul>
  51. 51. Directive break <ul><li>Break: fin de toutes les boucles. </li></ul><ul><li>Break dans une boucle while, for, foreach </li></ul><ul><ul><li>Fin d'itération. </li></ul></ul><ul><ul><li>Sortie de boucle </li></ul></ul><ul><li>Idéal pour la recherche du premier élément correspondant à un critère quelconque. </li></ul>
  52. 52. Recherche du premier mineur : break <ul><li>foreach ($tab as $fils => $info) { </li></ul><ul><li>if ($info['age']<18) { </li></ul><ul><li>echo &quot;$fils est le premier mineur&quot;; </li></ul><ul><li>break ; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  53. 53. Directive: continue <ul><li>Continue: fin de la boucle courante. </li></ul><ul><li>Continue dans une bloucle : </li></ul><ul><ul><li>Terminaison de la boucle courante </li></ul></ul><ul><ul><li>Passage à la boucle suivante </li></ul></ul><ul><li>Idéal pour scunter, bypasser ou court-circuiter un ensemble d’instructions inutiles. </li></ul><ul><li>Évite l’utilisation d’un bloc if. </li></ul>
  54. 54. Ajout de 100 euros aux majeurs <ul><li>foreach ($tab as $fils => &$info) { </li></ul><ul><li>if ($info['age']<18) continue ; </li></ul><ul><li>echo &quot;$fils est majeur&quot;; </li></ul><ul><li>$info['montant']+=100; </li></ul><ul><li>} </li></ul>

×