54
Les structures de données Jean-Marie Renouard http://www.jmrenouard.fr

Structure de données en PHP

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Structure de données en PHP

Les structures de données

Jean-Marie Renouard

http://www.jmrenouard.fr

Page 2: Structure de données en PHP

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

Page 3: Structure de données en PHP

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

Page 4: Structure de données en PHP

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.

Page 5: Structure de données en PHP

13/04/23 http://www.jmrenouard.fr/ 5

Les tableaux à index

Page 6: Structure de données en PHP

13/04/23 http://www.jmrenouard.fr/ 6

for

Raccourci d'expression whilefor (expr1; expr2; expr3) {...}Peut être traduit par :

expr1;

while (expr2) {

...

expr3; }

Page 7: Structure de données en PHP

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++;

}

Page 8: Structure de données en PHP

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];

}

Page 9: Structure de données en PHP

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;

}

Page 10: Structure de données en PHP

13/04/23 http://www.jmrenouard.fr/ 10

Exemples

C5tableaux/tableau5.phpC5tableaux/tableau7.phpC5tableaux/tableau11.php

Page 11: Structure de données en PHP

13/04/23 http://www.jmrenouard.fr/ 11

Les tableaux à clé/valeur

Page 12: Structure de données en PHP

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.

Page 13: Structure de données en PHP

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

Page 14: Structure de données en PHP

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";

}

Page 15: Structure de données en PHP

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;

}

Page 16: Structure de données en PHP

13/04/23 http://www.jmrenouard.fr/ 16

Les tableaux multi-dimensionnelles

Page 17: Structure de données en PHP

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

Page 18: Structure de données en PHP

13/04/23 http://www.jmrenouard.fr/ 18

Table SQL: tableau multidim.

Page 19: Structure de données en PHP

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

Page 20: Structure de données en PHP

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;

}

Page 21: Structure de données en PHP

13/04/23 http://www.jmrenouard.fr/ 21

Exemple:

C5tableaux/tableau1.phpC5tableaux/tableau6.php

Page 22: Structure de données en PHP

13/04/23 http://www.jmrenouard.fr/ 22

Les tableaux de référence

Page 23: Structure de données en PHP

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.

Page 24: Structure de données en PHP

13/04/23 http://www.jmrenouard.fr/ 24

Les parcours de tableau

Page 25: Structure de données en PHP

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

Page 26: Structure de données en PHP

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.

Page 27: Structure de données en PHP

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];

}

Page 28: Structure de données en PHP

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>";

}

Page 29: Structure de données en PHP

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);

}

Page 30: Structure de données en PHP

13/04/23 http://www.jmrenouard.fr/ 30

Les manipulations des tableaux

Page 31: Structure de données en PHP

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

Page 32: Structure de données en PHP

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

Page 33: Structure de données en PHP

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

Page 34: Structure de données en PHP

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);

Page 35: Structure de données en PHP

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

Page 36: Structure de données en PHP

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

Page 37: Structure de données en PHP

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)

Page 38: Structure de données en PHP

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);

Page 39: Structure de données en PHP

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)

Page 40: Structure de données en PHP

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)

Page 41: Structure de données en PHP

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);

Page 42: Structure de données en PHP

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);

Page 43: Structure de données en PHP

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.

Page 44: Structure de données en PHP

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, …)

Page 45: Structure de données en PHP

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, …)

Page 46: Structure de données en PHP

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()

Page 47: Structure de données en PHP

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()

Page 48: Structure de données en PHP

13/04/23 http://www.jmrenouard.fr/ 48

Les ruptures de parcours

Page 49: Structure de données en PHP

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.

Page 50: Structure de données en PHP

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),

);

Page 51: Structure de données en PHP

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.

Page 52: Structure de données en PHP

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;

}

}

Page 53: Structure de données en PHP

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.

Page 54: Structure de données en PHP

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;

}