IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Récursivité include / fonction


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut [Tableaux] Récursivité include / fonction
    J'ai un script que j'appelle régulièrement de manière récursive

    Pour simplifier, le script s'appellant gna.php est comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    requete sql
    traitement
    include gna.php
    autre traitement
    il fonctionne parfaitement, il y a les conditions d'arrêt nécessaires etc.

    le défaut est qu'il fait à chaque fois un include et que cela prend du temps (il peut ainsi y avoir plus de 300 include dans la même page)

    donc j'avais pensé à remplacer les include par une fonction. je n'ai pas essayé encore mais cela ne doit pas être trop difficile à réaliser.

    le problème est que dans une fonction toutes les variables sont locales, et pour mon code il ne faut pas qu'elles le soient. je pourrais bien sûr toutes les déclarer comme globales, mais il y en a beaucoup (dont des tableaux) et cela ne me paraît pas de la programmation optimisée

    quelqu'un connait-il une autre solution plus élégante ?

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    la variable $GLOBALES existe partout et permet de référencer toutes les variables, exemple pour accèder à $coucou : $GLOBALES['coucou']

    et on peut même accèder à elle-même : $GLOBALES['GLOBALES']...

    un petit t'en persuadera

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    je n'ai peut-être pas bien compris ce que tu me proposes. d'habitude, je fais ainsi :

    dans mon script de base
    dans ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function ($param)
     {
     global $a;
     traitement avec $a et $param
     }
    ta proposition semble différente mais je n'ai pas compris ...

    ps - j'ai essayé ton var_dump($GLOBALES) et il me donne comme message undefined variable : GLOBALES

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    exacte, il n'y a pas de e à GLOBALES, en fait c'est $GLOBALS

    en fait, au lieu de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function ($param)
     {
     global $a;
     traitement avec $a et $param
     }
    il te suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function ($param)
     {
     traitement avec $GLOBALS['a'] et $param
     }

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    j'ai fait le var_dump effectivement on voit tout

    compris ta suggestion, sur le fond c'est pareil n'est-ce pas
    et je dois quand-même changer tout le code de mon include pour changer $a en $GLOBALS['a']...

    en fait j'espérais qu'il y avait un équivalent include qui stockait cela quelque part sans pour autant le considérer comme une inclusion de fichier

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Puisque ces deux syntaxes donnent des résultats identiques, je ne vois pas pourquoi tu veux t'embêter à réécrire ton code existant.
    Dans les deux cas, tu accèderas à une variable globale. Dans les deux cas, c'est tout autant foireux (pour reprendre l'idée que tu émettais plus haut) mais dans aucun cas je ne vois de parade.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    oui il me suffirait de rajouter une ligne global $toutesmesvariables en début de script de fonction

    mais j'espérais que quelqu'un ait une parade à ce truc foireux ...
    comme un goto par exemple qui semble ne pas exister en php (j'ai lu que cela existerait avec php6, mais pas installé chez mon hébergeur ni chez moi...

  8. #8
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Perso, ce que j'ai du mal à saisir : pourquoi y a-t-il autant d'includes ?
    Même les scripts énormes disponibles partout sur le Net n'en ont pas autant.
    Peut-être serait-il intéressant de revoir un peu plus en profondeur la structure de ton appli. Nous pourrions t'y aider, si tu donnais davantage d'informations.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    c'est pour un arbre généalogique
    dans una base de données, j'ai tous les noms et pour chacun il y a le nom du père et de la mère
    le client choisit un nom
    la structure est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    requete sql sur ce nom pour trouver les renseignements affichés ainsi que le père et la mère
    requete identique sql sur le nom du pere donnant ainsi les grand-parents paternels
    requete identique sur le grand-père donnant les arrières grand-parents
    paternels
    etc jusq'à ce qu'il y a ni père ni mère
    ensuite on redescend d'une génération et on fait la même requête sur la mère etc etc.
    donc s'il y a dix générations cela fait beaucoup de monde
    et à chaque fois je fais un include (que je souhaitais changer en fonction pour ne pas faire 300 include)
    et à chaque include il y a un traitement d'affichage (position du nom dans l'arbre généalogique (en hauteur et en largeur) et les liens

  10. #10
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Okay

    La différence entre un include et une fonction, c'est que PHP doit relire le fichier à chaque fois que tu l'inclus. Pour une fonction, il l'aurait déjà en mémoire.
    La différence est minime, je ne pense pas que cela influe beaucoup sur tes performances.
    Je pense que la différence se situe principalement au niveau de la sémantique : soit tu considères que tu inclues une feuille dans ton arbre, soit si tu considères que c'est un affichage simple.

    Perso, j'ai tendance à utiliser un moteur de templates jusque dans mes tout petits projets. Ici, cela me semble particulièrement indiqué. Ta feuille serait un simple bloc du template, donc une itération d'une boucle (ni un include ni même une fonction).

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    je pensais qu'appeler la fonction 300 fois était plus rapide que de faire 300 include, mais tu as l'air de dire que la différence est minime

    par contre, je suis désolé, mais je n'ai rien compris de ce que tu écris plus loin. pourrais-tu un peu expliciter ce que tu veux dire par ma feuille serait un simple bloc du template, donc une iteration d'une boucle ?

    pour être honnête, je ne suis pas très accoutumé aux templates

  12. #12
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Oui, enfin, j'ai pas fait de bench hein... Je ne connais pas la différence exacte entre les 2 techniques.

    Sinon, j'imagine que ton code se présente plus ou moins de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     while($leaf = mysql_fetch_assoc($result)){
       include('leaf.php'); // Affichage d'une feuille de l'arbre
    }
    Et que tu souhaites le convertir en quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while($leaf = mysql_fetch_assoc($result)){
       display_branch($leaf); // Affichage d'une feuille de l'arbre
    }
    Voici ce que je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while($leaf = mysql_fetch_assoc($result)){
       $template->assign_block_vars('one_leaf', array(
          'NAME'    => $leaf['relative_name'],
          'PHOTO'   => $leaf['relative_photo'],
          'BIRTH'   => $leaf['relative_birthdate']
          )); // Affichage d'une feuille de l'arbre
    }
    Je pense que c'est assez clair, dans cet exemple simpliste : avec un template, tu ne délèguerais pas l'affichage à une sorte de boîte noire dont tu ne connaîtrais pas le fonctionnement. À l'inverse, tu enverrais directement les variables dans la page Web, ce qui te donnerait un meilleur contrôle.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    je vais étudier ta solution parce que comme dit plus haut les templates je n'y comprend rien.

    mais SI j'ai compris, sur le fond je crois déjà le faire. En effet, en reprenant ton exemple, le include('leaf.php'); ou display_branch($leaf); dans mon script, n'affichent rien mais stockent toutes les données nécessaires, tel que le nom, la photo ou la date de naissance, dans un tableau (que je pense être équivalent au template).
    Ce tableau ne sera affiché que plus tard lorsque tout l'arbre généalogique est enregistré, et ce tableau sera affiché selon des critères spécifiques (exemple affichage de gauche à droite ou de droite à gauche)

    Par contre, et toujours SI j'ai bien compris, le code simplifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while($leaf = mysql_fetch_assoc($result)){
       include('leaf.php');
       OU
       display_branch($leaf);
       OU 
       store_branch($leaf); 
    }
    EST le code de leaf.php, d'où la récursivité. Sachant que le while ne peut donner que deux résultats : le père s'il existe OU false ce qui fait arrêter la boucle

    Donc, et toujours SI j'ai bien compris, le template ne règle pas vraiment mon problème.

    Maintenant, si j'ai compris le template de travers, excuse-moi

  14. #14
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    C'est à moi de te demander de m'excuser :/

    En effet, le template ne s'applique pas au cas que tu décris, puisqu'il n'est utile que dans une situation d'affichage.
    Un template est un fichier HTML générique composé de blocs. Il est ouvert par le moteur de templates et les blocs sont générés à la volée, de manière à construire la page finale petit à petit, sans avoir 50 fois le même bloc de code dans le fichier source HTML qui est stocké sur le serveur.
    Cela permet de répéter les blocs de HTML à partir d'une boucle PHP, ce que j'ai supposé que tu faisais au moyen d'un include ou d'une fonction.

    L'intérêt du moteur de templates est de séparer le code PHP du code HTML. Cela ne change pas vraiment les possibilités, simplement la manière d'organiser le code.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    donc, je pourrais certainement utiliser les templates en remplacement du tableau généré par mon include/fonction.

    j'étudierai cela plus tard.

    mais pour mon problème, je vais remplacer mes include par une fonction, en déclarant les variables nécessaires en global, puisqu'il semble que cela est un peu plus rapide

    Merci Yogui
    Merci Swoög

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] problème de fonction include
    Par titounnette dans le forum Langage
    Réponses: 4
    Dernier message: 14/01/2008, 12h07
  2. [Tableaux] Pb avec fonction qui retourne 2 variables
    Par cyberdevelopment dans le forum Langage
    Réponses: 6
    Dernier message: 12/07/2006, 14h19
  3. [Tableaux] Transformer en fonction
    Par Tr@nkill dans le forum Langage
    Réponses: 6
    Dernier message: 18/04/2006, 14h07
  4. Retourner 2 tableaux d'une fonction...
    Par TigreRouge dans le forum Langage
    Réponses: 4
    Dernier message: 04/04/2006, 14h32
  5. Réponses: 2
    Dernier message: 08/12/2005, 19h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo