Une question que l’on m’a posé.
Quel instruction je n’ai jamais jamais réussi à utiliser dans php ? Dans le sens jamais trouvé d’utilisation pratique.
Ma réponse est un array_recursive_walk()
et dans la même idée les RecursiveIteratorIterator
Et puis on m’a demander la différence entre un array_walk
et un array_map
.
array_map
Voici quelques exemples
1 2 3 |
|
array_map
ne touche pas le tableau original.
En fait array_map
fait exactement ceci.
1
|
|
De manière générale
1 2 |
|
- On renvoie un tableau de la même taille.
- la fonction appelé doit contenir un return
- C’est de la programmation fonctionnelle (c’est le map de MapReduce).
- On ne connais pas l’index (que l’on pourrai récupérer dans un
foreach($array as $key => $value)
).
Array_walk
1 2 3 4 5 6 7 |
|
Constatons:
- Je passe par référence
&input
. - Donc je n’ai pas besoin de
return
. - Donc nous sommes dans du procédural. (ce qui n’est pas forcément un défaut)
- J’ai économisé une variable
- On est obligé d’écrire des fonctions à deux arguments certaines fonctions comme
ucfirst
refusent d’avoir plusieurs arguments. - Par contre, on connait l’index (
$key
) mais impossible de le modifier. array_walk
renvoietrue
orfalse
ce qui n’aide pas beaucoup
1 2 3 4 5 6 |
|
Pour résumer les deux fonctions ont un peu près le même résultat.
array_walk
prend un array et remplace chaque valeurs par Fonction(valeur).array_map
prend un array et recrée un array de la même taille.
Le Array_recursive_walk
Un exemple de code.
Je voulais faire un CamelCase
-> snake_case
mais comme le array_walk
impossible de modifier les clés des index.
Soit l’exemple suivant
1 2 3 4 5 6 7 8 9 |
|
Le programme n’affiche pas de Cowabunga
, mais j’ai mis en majuscule toutes les valeurs.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
On ne passe jamais sur le clé : Tortue-ninja
, d’ailleurs la documentation est claire
Toute clé qui est associée à un tableau n’est pas passée à la fonction de rappel.
Un vrai exemple
1 2 3 4 5 |
|
`
Un exemple que l’on retrouve dans PHPUnit et Symfony2
On veut logger des objets en les serialisant en Json. Certain objects (comme les ArrayCollection et autres..) sont Traversables (c’est à dire qu’il possède un Iterateur (On implémente current
, next
, rewind
, valid
). En php il est possible de transformer les Itérateurs en Array avec l’instruction iterator_to_array()
. ainsi on transforme l’objet en Array pour avoir plus d’information.
En conclusion
Donc je n’ai jamais réussi à écrire un array_walk_recursive
mais au moins j’ai réussi à écrire un post dessus.