> Tech > Jouons un peu avec les matrices

Jouons un peu avec les matrices

Tech - Par Renaud ROSSET - Publié le 16 juillet 2012
email

Dans le premier article de cette série, PHP vu sous l’angle de RPG : Principes de base de PHP, j'ai utilisé une matrice de base pour présenter le concept de matrices associatives.

Jouons un peu avec les matrices

Principes de base de PHP

Ce faisant, j’ai simplement effleuré la puissance et la souplesse des matrices PHP. En fait, il y a plus de 70 fonctions de matrice dans le langage PHP. Soit presque autant que dans RPG IV au total. Bien que je ne puisse pas les couvrir toutes dans un encadré comme celui-ci, le script de la figure 5 donne un bon aperçu de ce qui est possible. Pour avoir la liste complète des fonctions de matrice, consultez le manuel en ligne (php.net/manual/en/ref.array.php). Les exemples en ligne vous seront très utiles au fur et à mesure de l’étude des fonctions.

Examinez la figure 5. En A je commence par définir la matrice associative $languageData, que j’utilise dans cet exemple. Ensuite, je trie la matrice en B de la figure 5, avec la fonction asort(). Ne confondez pas cela avec SORTA de RPG (l’équivalent PHP de cela est sort(), que nous verrons plus loin). Il est nécessaire d’utiliser asort() parce que, quand on travaille avec une matrice associative et qu’on trie les valeurs, les clés doivent maintenir leur association avec ces valeurs. La boucle foreach suivant asort() affiche la matrice dans son nouvel ordre :

First sort array in ascending value sequence (premier tri de la matrice en ordre croissant)

3 years of PHP
5 years of RPG/400
7 years of Java
12 years of COBOL
15 years of RPG IV

RPG utilise les mots-clés ASCEND et DESCEND pour indiquer que SORTA doit trier en ordre croissant ou décroissant. En PHP l’équivalent de clé décroissante de asort() est arsort(), ce qui est démontré en C de la figure 5 et produit la sortie suivante :

Same array but sorted in reverse value order (Même matrice mais triée dans l’ordre de valeur inverse)

15 years of RPG IV
12 years of COBOL
7 years of Java
5 years of RPG/400
3 years of PHP

Et si je voulais ordonner la matrice non pas par ses valeurs mais par la valeur des clés ? Je peux, entre autres, utiliser la fonction array_flip() en D de la figure 5. Cette fonction renvoie une nouvelle matrice où les clés deviennent les valeurs et les valeurs deviennent les clés. La sortie du script montre la permutation :

Demonstrating how the keys and values can be reversed (Démontrer comment les clés et les valeurs peuvent être inversées)

the key is 15 and the value is RPG IV
the key is 12 and the value is COBOL
the key is 7 and the value is Java
the key is 5 and the value is RPG/400
the key is 3 and the value is PHP

La matrice pourrait ensuite être triée au moyen de asort() ou arsort selon le cas. Vous avez probablement deviné que, pour utile qu’elle soit, je n’ai pas besoin d’utiliser cette fonction juste pour atteindre mon objectif. Les fonctions ksort() et krsort() feront cela comme démontré en E et F respectivement dans la figure 5. Et donneront ce résultat :

Now we’ll sort the original array by the keys (Maintenant, trions la matrice originale par les clés)

12 years of COBOL
7 years of Java
3 years of PHP
15 years of RPG IV
5 years of RPG/400

And then in reverse key order (Puis dans l’ordre de clé inverse)

5 years of RPG/400
15 years of RPG IV
3 years of PHP
7 years of Java
12 years of COBOL

Vous voyez donc que l’on peut faire énormément de choses avec les matrices PHP. Et pourtant, je n’ai fait que gratter la surface. Avant de conclure, voyons quelques autres fonctions.

Les matrices de PHP ont un curseur (exactement comme une base de données), et vous pouvez manipuler ce curseur par diverses fonctions comme next() et prev(). Regardez le code qui commence en G, figure 5 et vous verrez de quoi je parle. Comme la boucle « foreach » précédente a laissé le curseur dans une position indéfinie, j’ouvre avec la fonction reset() pour replacer le curseur en haut de la matrice. Cela est vérifié en faisant écho du contenu de l’élément current() et en utilisant la fonction key() pour afficher la clé courante. Je démontre ensuite le résultat fourni par les fonctions next(), end(), et prev().

Next we jump around using the array cursor (Puis nous sautons en utilisant le curseur de matrice)

After a reset(), the array cursor points to the value 5 with the key RPG/400
(après un reset(), le curseur de matrice pointe sur la valeur 5 avec la clé RPG/400)
The next value is 15 with the key RPG IV
(la valeur suivante est 15 avec la clé RPG IV)
The last entry is 12 with the key COBOL
(la dernière entrée est 12 avec la clé COBOL)
Finally we step back one to the value 7 with the key Java
(finalement nous reculons à la valeur 7 avec la clé Java)

J’ai promis que je reviendrais à la fonction sort() (H dans la figure 5) avant de terminer. En fait, je n’ai retardé cette opération que parce qu’elle aurait « détruit » ma matrice associative, et que je ne voulais pas avoir à la copier ! sort() fonctionne de la même manière que SORTA de RPG : il ordonne les valeurs dans la matrice. Mais en faisant cela, sort() détruit des clés et reconstruit la matrice en utilisant un index numérique classique. Exécutez le script et examinez-le. La sortie ontenue n’a pas beaucoup de sens, mais démontre bien les principes. Je n’ai pas inclus d’exemple, mais vous avez probablement deviné que la fonction rsort() est l’équivalent de SORTA avec le mot-clé DESCEND appliqué. N’est-il pas intéressant de pouvoir trier une matrice de plusieurs manières sans avoir à lier l’ordre aux définitions de données elles-mêmes comme vous le faites avec RPG ? Vous pouvez voir les « nouvelles » clés numériques dans la sortie du script — démarrant à zéro bien entendu.

Finally ignore the keys and just sort the values (Finalement ignorer les clés et trier simplement les valeurs)

Value is 3 key is now 0
Value is 5 key is now 1
Value is 7 key is now 2
Value is 12 key is now 3
Value is 15 key is now 4

Vous venez d’avoir un aperçu du monde étonnant des matrices PHP. Je traiterai de quelques autres fonctions sur le forum e-Development à SystemiNetwork.com (tinyurl.com/PHPHomework), mais si vous avez l’esprit aventureux, regardez donc array_diff_…() et array_intersect_…(). En réalité, vous pouvez utiliser les matrices PHP  presque comme des bases de données.

Téléchargez cette ressource

Préparer l’entreprise à l’IA et aux technologies interconnectées

Préparer l’entreprise à l’IA et aux technologies interconnectées

Avec la « quatrième révolution industrielle », les environnements hyperconnectés entraînent de nouveaux risques en matière de sécurité. Découvrez, dans ce guide Kaspersky, comment faire face à cette nouvelle ère de vulnérabilité.

Tech - Par Renaud ROSSET - Publié le 16 juillet 2012