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

Structure de données en PHP

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