Rechercher : dans
Par :

[PHP] Fonction récursive dans une boucle

Dernière réponse le 15 mar 2009 à 17:45:14 Dédé86, le 15 mar 2009 à 15:59:55 
 Signaler ce message aux modérateurs

Bonjour,

Je galère depuis un moment sur une fonction récursive permettant d'afficher une arborescence de dossiers. Cette dernière fonctionne mais je ne suis pas sur de bien comprendre son fonctionnement.... En effet, dans cette fonction récursive, j'ai une boucle qui tourne tant qu'il reste des dossiers à afficher. Mais dans cette boucle, j'ai un appel récursif à cette même fonction....

J'ai l'impression que la récursion est appelé uniquement quand le dernier tour de boucle arrive (et non pas à chaque fois que le programme rentre dans la boucle comme je le pensais). Voici mon code :

function display_children($parent, $level) { 

   //Affichage de tous les dossiers de niveau N
   $result = mysql_query("SELECT * FROM arborescence WHERE parentDossier='$parent'"); 


while ($row = mysql_fetch_array($result)) {
 $levelSousDossier = $level+1;
 echo str_repeat('  ',$levelSousDossier);?>
<img src="images/icones/dossier.jpg"><a name="<?php echo $row['idDossier'];?>" href="mesdocuments.php?idDossier=<?php echo $row['idDossier'];?>">
   <?php echo $row['nomDossier'].'<br>';?>
  <?php
    display_children($row['idDossier'], $level+1); 
 }
?>
<?php
}


Es-ce que quelqu'un peut m'expliquer le fonctionnement de la fonction svp ?

Merci d'avance..

Meilleures réponses pour « [PHP] Fonction récursive dans une boucle » dans :
PHP - Les fonctions Voir La notion de fonction On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps du programme principal. Les fonctions permettent d'exécuter dans plusieurs parties du...
[PHP] Fonction mail() VoirLa fonction mail() est bloquée chez certains des hébergeurs gratuits pour des raisons de sécurité (afin d'éviter le spam notamment), l'adresse ip de la machine qui a demandé le script sera alors indiquée dans le header 'X-MM-Mail-From-IP'. renseignez...
Quelques fonctions utiles VoirCette astuce vous montrera comment utiliser quelques fonctions très utiles en PHP: Retourne la longueur de la chaîne Utilisation Résultat Passe tous les caractères en minuscules. Utilisation Résultat Passe tous les caractères en...
Supprimer les accents avec PHP VoirPour un tas de raisons, il est parfois utile de convertir un texte accentué en un texte sans accents. Voici une fonction permettant de transformer très simplement la quasi-totalité des accents en leur équivalent non-accentués : function...
PHP - Mail et fonctions réseau VoirPHP étant un langage consacré au Web, il possède bien évidemment des fonctions lui permettant de communiquer avec le "monde extérieur" à l'aide de fonctions standards. Le service le plus utilisé sur Internet étant la messagerie électronique, il est...
PHP - Les fichiers VoirLa gestion des fichiers avec PHP Avec PHP, la création ou la lecture de fichiers est, une fois de plus, assez simple. Il existe une multitude de fonctions dédiées à l'utilisation des fichiers. La communication entre le script PHP et le fichier...
PHP - Structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (le PHP associe le mot clé true à 1...

1

Alain_42, le 15 mar 2009 à 17:34:16

<?php
function display_children($parent, $level) { 

   //Affichage de tous les dossiers de niveau N
   $result = mysql_query("SELECT * FROM arborescence WHERE parentDossier='$parent'"); 


	while ($row = mysql_fetch_array($result)) {
		$levelSousDossier = $level+1;
		echo str_repeat('&nbsp;&nbsp;',$levelSousDossier);?>
		<img src="images/icones/dossier.jpg"><a name="<?php echo $row['idDossier'];?>" href="mesdocuments.php?idDossier=<?php echo $row['idDossier'];?>">
		<?php echo $row['nomDossier'].'<br>';
		
		display_children($row['idDossier'], $level+1); 
	}
?
<?php
}
?>
 premier passage de boucle la requette met les réponses du niv1 dans la ressource $result
 
 mais dans la boucle while comme tu rappelle la fonction display_children tu reexecutes la requette sur le niveau 2 ce qui fiat que les réponses viennent écraser £result, 
  essayes un truc dans ce genre pour avoir une ressource différente par chaque boucle (j'ai pas tésté)
 <?php
 $i=0;
function display_children($parent, $level) { 

   //Affichage de tous les dossiers de niveau N
   ${'result'.$i} = mysql_query("SELECT * FROM arborescence WHERE parentDossier='$parent'"); 


	while ($row = mysql_fetch_array(${'result'.$i})) {
		$levelSousDossier = $level+1;
		echo str_repeat('&nbsp;&nbsp;',$levelSousDossier);
		?>
		<img src="images/icones/dossier.jpg"><a name="<?php echo $row['idDossier'];?>" href="mesdocuments.php?idDossier=<?php echo $row['idDossier'];?>">
		<?php 
		echo $row['nomDossier'].'<br>';
		
		display_children($row['idDossier'], $level+1); 
	}
	$i++;
}

Répondre à Alain_42

2

Dédé86, le 15 mar 2009 à 17:42:11

Merci pour ta réponse.
Je vais me re-documenter correctement sur la récursion et refaire au "papier" l'algorithme. En fait, ce que je voudrais faire c'est utiliser le DOM pour pouvoir afficher l'arborescence des dossiers.

Répondre à Dédé86

3

 Alain_42, le 15 mar 2009 à 17:45:14

Après réflexion ce serait plutôt comme ça:

<?php

function display_children($parent, $level) { 

   //Affichage de tous les dossiers de niveau N
   ${'result'.$level} = mysql_query("SELECT * FROM arborescence WHERE parentDossier='$parent'"); 


	while ($row = mysql_fetch_array(${'result'.$level})) {
		$levelSousDossier = $level+1;
		echo str_repeat('&nbsp;&nbsp;',$levelSousDossier);
		?>
		<img src="images/icones/dossier.jpg"><a name="<?php echo $row['idDossier'];?>" href="mesdocuments.php?idDossier=<?php echo $row['idDossier'];?>">
		<?php 
		echo $row['nomDossier'].'<br>';
		
		display_children($row['idDossier'], $level+1); 
	}
	
}

Répondre à Alain_42