Upload
jean-marie-renouard
View
189
Download
0
Embed Size (px)
DESCRIPTION
Présentation des structures de données en PHP5
Citation preview
Jean-Marie Renouard LightPath 2014©
Le logo PHP est du domaine public http://commons.wikimedia.org/wiki/File:PHP-logo.svg
Ce document est licencié sous licence ◦ Attribution-NonCommercial-ShareAlike
◦ CC BY-NC-SA
Plus de détails: http://creativecommons.org/licenses/by-nc-sa/3.0/fr/
LightPath 2014© - http://www.jmrenouard.fr 2
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
LightPath 2014© - http://www.jmrenouard.fr 3
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.
LightPath 2014© - http://www.jmrenouard.fr 4
LightPath 2014© - http://www.jmrenouard.fr 5
Raccourci d'expression while
for (expr1; expr2; expr3) {...}
Peut être traduit par :
expr1;
while (expr2) {
...
expr3; }
LightPath 2014© - http://www.jmrenouard.fr 6
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++;
}
LightPath 2014© - http://www.jmrenouard.fr 7
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];
}
LightPath 2014© - http://www.jmrenouard.fr 8
Boucle de parcours par référence
Exemple de modification de tous les éléments:
$arr = array(1, 2, 3, 4);
Ou $arr=[ 1, 2, 3, 4];// PHP 5.4
foreach ($arr as &$value) {
$value = $value * 2;
}
LightPath 2014© - http://www.jmrenouard.fr 9
LightPath 2014© - http://www.jmrenouard.fr 10
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.
LightPath 2014© - http://www.jmrenouard.fr 11
Array_keys() : renvoie un tableau des clés
Array_key_exists(): indique si la clé est présente.
key(): renvoie la clé courante
LightPath 2014© - http://www.jmrenouard.fr 12
Boucle de parcours de tableau
Exemple avec des tableaux à clé :
$tab = array ("un" => 1, "deux" => 2
"trois" => 3, "dix-sept" => 17 );
$tab=["un" => 1, "deux" => 2
"trois" => 3, "dix-sept" => 17];// PHP 5.4
foreach ($tab as $cle => $val) {
echo "\$tab[$cle] => $val.\n";
}
LightPath 2014© - http://www.jmrenouard.fr 13
Boucle de parcours par référence
Exemple avec des tableaux à clé :
$tab = array ("un" => 1, "deux" => 2
"trois" => 3, "dix-sept" => 17 );
$tab=["un" => 1, "deux" => 2
"trois" => 3, "dix-sept" => 17];// PHP 5.4
foreach ($tab as $cle => &$val) {
$val*=2;
}
LightPath 2014© - http://www.jmrenouard.fr 14
LightPath 2014© - http://www.jmrenouard.fr 15
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
LightPath 2014© - http://www.jmrenouard.fr 16
LightPath 2014© - http://www.jmrenouard.fr 17
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
LightPath 2014© - http://www.jmrenouard.fr 18
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;
}
LightPath 2014© - http://www.jmrenouard.fr 19
LightPath 2014© - http://www.jmrenouard.fr 20
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.
LightPath 2014© - http://www.jmrenouard.fr 21
LightPath 2014© - http://www.jmrenouard.fr 22
2 techniques par itération.
◦ Directive :Foreach
◦ Directive : For
2 techniques par navigation/position.
◦ Directive : Each/list
◦ Directive : Current/next
LightPath 2014© - http://www.jmrenouard.fr 23
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.
LightPath 2014© - http://www.jmrenouard.fr 24
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];
}
LightPath 2014© - http://www.jmrenouard.fr 25
List / each: fonctions de parcours $tab=array(
"France"=>"Paris",
"Great Britain"=>"London",
"Belgique"=>"Brüssel");
$tab=["France"=>"Paris« ,"Great Britain"=>"London« ,"Belgique"=>"Brüssel" ]; //PHP5.4
while(list($cle,$valeur) = each($tab) ) {
echo "clé <b>$cle</b> / valeur <b>$valeur</b> <br>";
}
LightPath 2014© - http://www.jmrenouard.fr 26
current/ key/next/ reset: fonctions de parcours $tab=array(
"France"=>"Paris",
"Great Britain"=>"London",
"Belgique"=>"Brüssel");
$tab=["France"=>"Paris« ,"Great Britain"=>"London« ,"Belgique"=>"Brüssel" ]; //PHP5.4
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);
}
LightPath 2014© - http://www.jmrenouard.fr 27
LightPath 2014© - http://www.jmrenouard.fr 28
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
LightPath 2014© - http://www.jmrenouard.fr 29
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
LightPath 2014© - http://www.jmrenouard.fr 30
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
LightPath 2014© - http://www.jmrenouard.fr 31
Découpage les 2 premiers éléments ◦ array_splice( $tab, indice);
Dépoupage des 2 derniers éléments ◦ array_splice( $tab, indice, -indice);
LightPath 2014© - http://www.jmrenouard.fr 32
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
LightPath 2014© - http://www.jmrenouard.fr 33
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
LightPath 2014© - http://www.jmrenouard.fr 34
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)
LightPath 2014© - http://www.jmrenouard.fr 35
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);
LightPath 2014© - http://www.jmrenouard.fr 36
array_intersect ($tab1, $tab2) : intersection
array_diff($tab1, $tab2) : différence en bleu
array_merge ($tab1, $tab2) : la fusion(E)
LightPath 2014© - http://www.jmrenouard.fr 37
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)
LightPath 2014© - http://www.jmrenouard.fr 38
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);
LightPath 2014© - http://www.jmrenouard.fr 39
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);
LightPath 2014© - http://www.jmrenouard.fr 40
Array_flip($tab)
Les clés deviennent les valeurs.
Les valeurs deviennent les clés
Seule la dernière valeur fait office de clé finale.
LightPath 2014© - http://www.jmrenouard.fr 41
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, …)
LightPath 2014© - http://www.jmrenouard.fr 42
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, …)
LightPath 2014© - http://www.jmrenouard.fr 43
Remplissage : array_fill()
Somme : array_sum()
Différence : array_diff()
Intersection : array_intersect()
Union : array_push()
Application de fonction : array_walk()
Filtrage : array_filter()
LightPath 2014© - http://www.jmrenouard.fr 44
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()
LightPath 2014© - http://www.jmrenouard.fr 45
LightPath 2014© - http://www.jmrenouard.fr 46
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.
LightPath 2014© - http://www.jmrenouard.fr 47
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),
); PHP 5.4 uniquement $tab=[
"Pierre" => ["age"=> 18, "montant"=>100], "Louis" => ["age"=> 10, "montant"=>50], "Benjamin" => ["age"=> 20, "montant"=>200], "Luc" => ["age"=> 25, "montant"=>550], "Marc" => ["age"=> 8, "montant"=>30],
];
LightPath 2014© - http://www.jmrenouard.fr 48
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.
LightPath 2014© - http://www.jmrenouard.fr 49
foreach($tab as $fils => $info) {
if ($info['age']<18) {
echo "$fils est le premier mineur";
break;
}
}
LightPath 2014© - http://www.jmrenouard.fr 50
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.
LightPath 2014© - http://www.jmrenouard.fr 51
foreach($tab as $fils => &$info) {
if ($info['age']<18) continue;
echo "$fils est majeur";
$info['montant']+=100;
}
LightPath 2014© - http://www.jmrenouard.fr 52
LightPath: ◦ Société de conseil et d’ingénierie
◦ Formations, Conseil, Audit et mise en œuvre
Jean-Marie RENOUARD ◦ [email protected]
◦ Twitter: @jmrenouard
◦ http://www.jmrenouard.fr
LightPath 2014© - http://www.jmrenouard.fr 53