Structure de données en PHP

7,450 views
7,426 views

Published on

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

Published in: Technology
1 Comment
1 Like
Statistics
Notes
  • c bient
    &
    merciiii pour votre information
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
7,450
On SlideShare
0
From Embeds
0
Number of Embeds
3,274
Actions
Shares
0
Downloads
31
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

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>

×