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

Structure de données en PHP

Jun 18, 2015

Download

Technology

Présentation des structures de données en PHP et des diverses formes d'utilisation.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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;

}