Recursivité en PHP ?

  • Auteur de la discussion Auteur de la discussion tabouet
  • Date de début Date de début
WRInaute discret
Bonjour,

En php, peut-on appeler une fonction à l'intérieur d'elle même ?
Par exemple :

Code:
function faituntruc($var)
      {

      /* un peu de code */

      faituntruc($uneautrevar);

      /* encore un peu de code */

     }
Si mes souvenirs de Fac sont bons, n'est ce pas ce que l'on appelait récursivité en Pascal ? A prés.... peut-être que je me mélange les pinceaux entre tous les langages.

A bientôt,
Alexis
 
WRInaute accro
Je pense que oui comme dans tout langage (la recursivité n'est qu'une algorythmique specifique).

le seul bleme par rapport a des langages compilés ultra rapides en execution est qu'elle va vite se heurter à la limite de temps (30s) sur les mutu et meme a une limite de temps acceptable sur un dédié.

Parce que quoiqu'on en dise le php ca rame grave par rapport aux langages compilés (la moindre boucle un peu dense sur 3 ou 5000 elmeents et t'es dans les choux en php là ou des iterations en compilées identiques sur 100 ou 200.000 boucles se compte en 0,n secondes ...
 
WRInaute occasionnel
Effectivement rien n'empêche de faire de la recursion en php, sauf qu'effectivement, plus encore que pour les autres langage, c'est à éviter si tu veux te mettre à l'abris de problèmes de perf.

Fouille encore plus loin dans tes cours de fac et regarde la dérécursification ;)
En général c'est moins élégant mais ça va plus vite :)
 
WRInaute accro
ouaip en php vaut quelque fois mieux de la redondance de code qu'un include dans une boucle :mrgreen:

Oula k2pi, faut faire vachement gaffe sur ton www pour pas déraper sur une ads :mrgreen: :mrgreen:
 
Nouveau WRInaute
Je suis moyennement d'accord avec ce qui est dit.
Si la récursivité est une évidence et permet de produire du code beaucoup plus propre,c'est une bonne solution. D'autant plus que certaines fonctionnalités ne sont pas gérables en itératif (je pense notamment à la gestion d'arborescences).

Enfin, à toi de voir, mais tant que le serveur n'est pas sous-dimensionné par rapport au nombre de visiteurs, normalement ça ne devrait pas poser de problème :wink:
 
WRInaute accro
oui mais si ton code propre mets 35 secondes et que ton code sale mets 25 secondes ben c 'est vite arbitré :wink:
 
WRInaute accro
Moue un code sale mieux qu'un code propre n'est plus sale :mrgreen: Tu te fais vieux Zecat ! :lol: Laisse la place aux jeunes matous !
 
WRInaute accro
YoyoS a dit:
Moue un code sale mieux qu'un code propre n'est plus sale :mrgreen: Tu te fais vieux Zecat ! :lol: Laisse la place aux jeunes matous !
remplace sale par redondant et propre par non redondant :mrgreen:
 
WRInaute impliqué
Salutations, je ne pense pas que ce soit plus à éviter qu'ailleurs.
Exemple :
Tu as une fonction qui transforme le texte en smiley.

Et tu as une fonction qui vérifie du texte. L'un peut faire appel à l'autre, ça me semble cohérent.
 
WRInaute impliqué
Un appel récursif ne coute pas plus cher qu'une itération avec une pile. Les compilateurs et interprètes gèrent ça très bien. Le code est plus clair et plus élégant. Maintenant il ne faut pas en abuser et remplacer ce qui pourrait être itératif sans pile par une récursivité (quand rien n'est exécuté avant l'appel). Moralité tout doit être utilisé à bon escient. Zecat a raison regardez vos cours pour retrouver le bon usage de la récursion!! :D :D
 
WRInaute discret
Bonjour,

C'est bien ce qu'il me semblait....
Donc ce n'est pas pour cette raison que ma fonction ne fonctionne pas.

En fait c'est une fonction qui doit afficher la liste des dossiers et des fichiers (y compris ceux qui sont dans les sous-dossiers). Elle teste si le "truc" rencontré est un dossier ou un fichier.
- Si c'est un fichier elle affiche son nom.
- Si c'est un dossier, elle explore son contenu. (d'où l'appel de la fonction à l'intérieur d'elle même)

J'ai donc bricolé la fonction suivante, rien de bien compliqué :

Code:
function listerep($nomdurep)
	{
	$dh = opendir($nomdurep);
	while(!is_bool($fichier = readdir($dh)))
		{
		if (is_dir("$nomdurep/$fichier"))
			{
			echo "(R) <b>".$fichier."</b><br>";
			$temp = $fichier;
			listerep($temp); 
			}
		else
			{
	              echo "(F) ".$fichier."<br>";
			}
		}
	closedir($dh);	
	}

Cette fonction est dans un script qui est dans un dossier, j'appelle donc la fonction avec :

Code:
listerep("../");

pour lui permettre de remonter à la racine du site.

A l'exécution du script, c'est long :-( et j'ai l'affichage suivant qui se répète sur plusieurs centaines de lignes.

suivi de :

Fatal error: Maximum execution time of 60 seconds exceeded in ....

Je bosse avec PHP 5.3.0

A bientôt,
Alexis
 
WRInaute passionné
C'est normal, ta fonction liste également les "répertoires" nommés ".." et ".", ce qui crée tes bugs avec une boucle sans fin.
Il faut ajouter dans ton while
if($fichier != ".." && $fichier != ".")
 
WRInaute discret
Bonjour,

ça marche presque depuis l'ajout de ce que tu as proposé. Cependant, certains dossiers de peuvent pas être ouvert.
J'ai par exemple le message suivant :
Warning: opendir(system) [function.opendir]: failed to open dir: No error in C:\EasyPHP\www\www\liste.php on line 7

Warning: readdir(): supplied argument is not a valid Directory resource in C:\EasyPHP\www\www\liste.php on line 8

Warning: closedir(): supplied argument is not a valid Directory resource in C:\EasyPHP\www\www\liste.php on line 24

Si quelqu'un a une idée...
Je continu les recherches et je vous tiens au courant.

A bientôt,
Alexis
 
WRInaute passionné
C'est un Warning, donc certainement une question d'autorisation. Modifie les droits ou le proprio du répertoire.
 
WRInaute discret
Bonsoir,

Merci pour l'indication mais finalement j'ai abandonné cette piste.

J'avais besoin de parcourir les fichiers pour réaliser un moteur de recherche. Finalement, je vais utiliser un moteur open source que je vais adapter.

Bonne soirée,
Alexis
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut