structure de données en php
DESCRIPTION
Présentation des structures de données en PHP et des diverses formes d'utilisation.TRANSCRIPT
Les structures de données
Jean-Marie Renouard
http://www.jmrenouard.fr
13/04/23 http://www.jmrenouard.fr/ 2
A propos
Ce slide est offert à but non commercial
Jean-Marie Renouardhttp://www.jmrenouard.frConseil et formation en technologie Web
13/04/23 http://www.jmrenouard.fr/ 3
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
13/04/23 http://www.jmrenouard.fr/ 4
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é/valeurNombreuses fonctions de gestion des
tableaux.
13/04/23 http://www.jmrenouard.fr/ 5
Les tableaux à index
13/04/23 http://www.jmrenouard.fr/ 6
for
Raccourci d'expression whilefor (expr1; expr2; expr3) {...}Peut être traduit par :
expr1;
while (expr2) {
...
expr3; }
13/04/23 http://www.jmrenouard.fr/ 7
Foreach avec tableau à index
Boucle de parcours de tableau : foreachExemple avec des tableaux à index :
$arr = array(1, 2, 3, 4);
$i=0;
foreach ($arr as $value) {
echo “\$arr[“.$i.”]=“.$value;
$i++;
}
13/04/23 http://www.jmrenouard.fr/ 8
For avec tableau à index
Boucle de parcours de tableau : forExemple avec des tableaux à index :
$arr = array(1, 2, 3, 4);
for($i=0;$i<count($arr);$i++) {
echo “\$arr[“.$i.”]=“.$arr[$i];
}
13/04/23 http://www.jmrenouard.fr/ 9
Foreach avec tableau à index
Boucle de parcours par référenceExemple de modification de tous les
éléments:
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
13/04/23 http://www.jmrenouard.fr/ 10
Exemples
C5tableaux/tableau5.phpC5tableaux/tableau7.phpC5tableaux/tableau11.php
13/04/23 http://www.jmrenouard.fr/ 11
Les tableaux à clé/valeur
13/04/23 http://www.jmrenouard.fr/ 12
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.
13/04/23 http://www.jmrenouard.fr/ 13
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
13/04/23 http://www.jmrenouard.fr/ 14
Foreach avec tableau à clé
Boucle de parcours de tableauExemple avec des tableaux à clé :
$tab = array ("un" => 1, "deux" => 2
"trois" => 3, "dix-sept" => 17 );
foreach ($tab as $cle => $val) {
echo "\$tab[$cle] => $val.\n";
}
13/04/23 http://www.jmrenouard.fr/ 15
Foreach avec tableau à clé
Boucle de parcours par référenceExemple avec des tableaux à clé :
$tab = array ("un" => 1, "deux" => 2
"trois" => 3, "dix-sept" => 17 );
foreach ($tab as $cle => &$val) {
$val*=2;
}
13/04/23 http://www.jmrenouard.fr/ 16
Les tableaux multi-dimensionnelles
13/04/23 http://www.jmrenouard.fr/ 17
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
13/04/23 http://www.jmrenouard.fr/ 18
Table SQL: tableau multidim.
13/04/23 http://www.jmrenouard.fr/ 19
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
13/04/23 http://www.jmrenouard.fr/ 20
Exemples: comptage d’élément
function deepCount(&$tab) {
$nb_val=0;
for ($i=0;$i<count($tab);$i++) {
if(gettype($tab [$i])=="array") { $nb_val+=deepCount(&$tab[$i]);
} else { $nb_val++; }
}
return nb_val;
}
13/04/23 http://www.jmrenouard.fr/ 21
Exemple:
C5tableaux/tableau1.phpC5tableaux/tableau6.php
13/04/23 http://www.jmrenouard.fr/ 22
Les tableaux de référence
13/04/23 http://www.jmrenouard.fr/ 23
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.
13/04/23 http://www.jmrenouard.fr/ 24
Les parcours de tableau
13/04/23 http://www.jmrenouard.fr/ 25
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
13/04/23 http://www.jmrenouard.fr/ 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.
13/04/23 http://www.jmrenouard.fr/ 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];
}
13/04/23 http://www.jmrenouard.fr/ 28
Technique de parcours: Each
List / each: fonctions de parcours$tab=array(
"France"=>"Paris",
"Great Britain"=>"London",
"Belgique"=>"Brüssel");
while(list($cle,$valeur) = each($tab) ) {
echo "clé <b>$cle</b> / valeur <b>$valeur</b> <br>";
}
13/04/23 http://www.jmrenouard.fr/ 29
Technique de parcour: Current
current/ key/next/ reset: fonctions de parcours$tab=array(
"France"=>"Paris",
"Great Britain"=>"London",
"Belgique"=>"Brüssel");
reset($tab);
while( $val = current($tab) ) {
echo "L'élément de clé <b>".key($tab).
"</b> a la valeur <b>$val</b> <br>";
next($tab);
}
13/04/23 http://www.jmrenouard.fr/ 30
Les manipulations des tableaux
13/04/23 http://www.jmrenouard.fr/ 31
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
13/04/23 http://www.jmrenouard.fr/ 32
Affichage d’un tableau
var_dump: affiche le contenuprint_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
13/04/23 http://www.jmrenouard.fr/ 33
Découpe en sous-tableau
array_slice( $tab, indice_debut, taille);Dépoupage dans le tableau $tabA partir de l’indice $indice_debutUn sous-tableau de taille taille.
Ne pas confondre avec array_splice
13/04/23 http://www.jmrenouard.fr/ 34
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);
13/04/23 http://www.jmrenouard.fr/ 35
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
13/04/23 http://www.jmrenouard.fr/ 36
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
13/04/23 http://www.jmrenouard.fr/ 37
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)
13/04/23 http://www.jmrenouard.fr/ 38
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);
13/04/23 http://www.jmrenouard.fr/ 39
Calcul sur les ensembles
array_intersect ($tab1, $tab2) : intersection
array_diff($tab1, $tab2) : différence en bleu
array_merge ($tab1, $tab2) : la fusion(E)
13/04/23 http://www.jmrenouard.fr/ 40
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)
13/04/23 http://www.jmrenouard.fr/ 41
Manipulation de tous les éléments
Exécution de la fonction sur chaque éléments
Renvoi du tableau résultatArray_map($cb_function, $tab, $param)
Application d’une fonction sur chaque élément Array_walk($tab, $cb_function);
13/04/23 http://www.jmrenouard.fr/ 42
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);
13/04/23 http://www.jmrenouard.fr/ 43
Inversement clé/valeur
Array_flip($tab)La clé deviennent les valeurs.Les valeurs deviennent les clésSeule la dernière valeur fait office de clé
final.
13/04/23 http://www.jmrenouard.fr/ 44
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, …)
13/04/23 http://www.jmrenouard.fr/ 45
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, …)
13/04/23 http://www.jmrenouard.fr/ 46
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()
13/04/23 http://www.jmrenouard.fr/ 47
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()
13/04/23 http://www.jmrenouard.fr/ 48
Les ruptures de parcours
13/04/23 http://www.jmrenouard.fr/ 49
Rupture de parcours
Instructions d'altération de boucleIl est parfois nécessaire d’arrêter une
boucle.2 instructions majeures: break et continueCassure de boucle: for, foreach ou whileRupture de la 1ère boucle courante.Pas de propagation aux autres boucles.
13/04/23 http://www.jmrenouard.fr/ 50
Exemple
Soit le tableau des comptes des enfants:$tab=array(
"Pierre" => array("age"=> 18, "montant"=>100),
"Louis" => array("age"=> 10, "montant"=>50),
"Benjamin" => array("age"=> 20, "montant"=>200),
"Luc" => array("age"=> 25, "montant"=>550),
"Marc" => array("age"=> 8, "montant"=>30),
);
13/04/23 http://www.jmrenouard.fr/ 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.
13/04/23 http://www.jmrenouard.fr/ 52
Recherche du premier mineur : break
foreach($tab as $fils => $info) {
if ($info['age']<18) {
echo "$fils est le premier mineur";
break;
}
}
13/04/23 http://www.jmrenouard.fr/ 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.
13/04/23 http://www.jmrenouard.fr/ 54
Ajout de 100 euros aux majeurs
foreach($tab as $fils => &$info) {
if ($info['age']<18) continue;
echo "$fils est majeur";
$info['montant']+=100;
}