Bonjour,
La récursivité n'est pas forcément facile à comprendre (ou tout du moins à appréhender) au début.
En informatique, une fonction récursive est une fonction qui s'appelle elle-même. On s'en sert souvent pour parcourir des tableaux à plusieurs dimensions, soit lorsqu'il y a trop de niveaux, soit quand on ne les connait pas.
Dans ton exemple, ton tableau a deux niveaux ; s'il en va toujours ainsi, c'est simple, tu mets un foreach dans un foreach, ça fonctionne très bien ! Mais si tu travailles sur un tableau avec 5, 6, 7 dimensions ou plus, cela complique les choses ; surtout si le tableau en question peut contenir soit 5, soit 6, soit 7 dimensions. Dans le cas où tu ne connais pas le nombre de dimensions (ou qu'elles sont trop nombreuses), tu n'as pas vraiment d'autre choix que de faire une fonction récursive.
Le principe est tout simple : tu as un tableau en argument, sur lequel tu travailles :
| <?php
// La fonction récursive avec un tableau en paramètre
function recursiveFunction($array = array()){
// On boucle sur le tableau qui est passé en paramètre
foreach ($array as $item, $value) {
// ...
}
}
|
Ce code te permet de travailler sur le premier niveau du tableau passé en paramètre. Mais comment faire pour aller à un niveau plus bas ? En rentrant de nouveau dans la fonction ! Et pour cela, il suffit de vérifier que l'on ait bien un tableau :
| <?php
// La fonction récursive avec un tableau en paramètre
function recursiveFunction($array = array()){
// On boucle sur le tableau qui est passé en paramètre
foreach ($array as $item, $value) {
// Si $value est un tableau, je rentre de nouveau dans ma fonction récursive
if(is_array($value)) {
recursiveFunction($value);
}
}
}
|
La « subtilité » c'est que quand tu appelles la fonction récursive au sein d'elle-même, elle ne travaille plus sur l'array qui lui était passé au début, mais sur un autre, $value dans notre cas, qui correspond à une dimension "n" du tableau.
Il faut bien comprendre l'ordre d'exécution de la fonction. Prenons le tableau suivant :
| <?php
$array = array(
'one' => array('premier', 'first', 'primo'),
'two' => array('deuxième', 'second', 'secundo'),
'three' => array('troisième' => array(
'bonjour', 'salut', 'coucou'
)),
);
recursiveFunction($array);
|
On entre dans la fonction puis dans la boucle. On arrive sur le premier élément du tableau, à savoir 'one'. SI sa valeur est un tableau, on appelle de nouveau la fonction avec comme argument la valeur (un tableau, donc). Dans notre cas, 'one' est bien un tableau, on rentre donc de nouveau dans la fonction récursive. On arrive au foreach et à la condition : est-ce que la valeur ('premier', 'first' ou 'primo') est un tableau ? Non. La fonction récursive n'est donc pas appelée, le script reprend donc : on passe à 'two'. Le même processus se passe. On termine 'two'. On passe alors à 'three', qui est lui aussi un tableau. Donc : est-ce que 'three' est un tableau ? Oui : on rentre de nouveau dans la fonction récursive. Est-ce que 'troisième' est un tableau ? Oui : on entre de nouveau dans la fonction récursive. Est-ce que 'bonjour', 'salut' ou 'coucou' sont des tableaux ? Non, le script continue. Il n'y a plus d'élément à traiter, on sort de la fonction pour de bon.
Comme tu le vois, cela peut durer longtemps, en fonction du nombre de tableaux et de leurs profondeurs.