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 :

Appliquer une fonction à plusieurs valeurs par référence [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut Appliquer une fonction à plusieurs valeurs par référence
    Bonjour à tous,

    je souhaiterai appliquer une fonction à un ensemble de variables, variable

    Mon cas concret.
    Dans ma BD, j'ai des textes. Ce qui implique de la gestion en entrée/sortie par rapport aux éléments à déchapper/échapper (pas certain du mot déchapper )
    J'y fais appel en consultation, en modification et autre.
    Selon mes pages, j'en ai un nombre variable.

    En consultation pure, utilisation de stripslashes
    En modification, utilisation de stripslashes et nl2br

    Cela donne pour la modification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $data->commentaire1 = stripslashes(nl2br($data->commentaire1));
    ...
    $data->commentaireN = stripslashes(nl2br($data->commentaireN));
    J'aimerai quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function ModeModification($paramTableau) {
    	foreach($paramTableau as $indice => $elementTableau) {
    		$paramTableau[$indice] = stripslashes($elementTableau);
    	}
    }
     
    ModeModification(array(& $resBD->commentaire1,& $resBD->commentaire2,...,& $resBD->commentaireN));
    Mon code ne doit pas fonctionner, c'est juste pour donner une idée.
    Est-ce possible ?

    Merci d'avance pour vos suggestions.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ca serait plutot comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach($paramTableau as $elementTableau) {
    		$elementTableau = stripslashes($elementTableau);
    	}
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Est-ce possible ?
    Dans le principe, oui.

    Mais il y a 2 erreurs.
    La 1ère concerne le & qui déclare le passage par référence, il dois être fait au niveau de la déclaration de la fonction, et non lors de l'appel.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Déclaration
    function une_fonction(&$var_reference) {
    ... etc ...
    }
     
    // Usage
    $var_reference = 'bidule';
    une_fonction($var_reference);
    La 2ème c'est que (sauf erreur), tu ne peux pas "passer" un tableau en le créant en même temps dans l'appel à la fonction, du fait que celui-ci passe par rérérence.
    La variable doit exister, initialiser avant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Générera une erreur normalement
    une_fonction( array(1, 2, 3) );
     
    // Correcte
    $array = array(1, 2, 3);
    une_fonction( $array );
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  4. #4
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut
    Merci pour votre réponse.
    Par contre, je sais bien comment l'on passe une variable par référence, là n'est pas la question.
    Le but est d'appeler une fonction et que les traitements de cette fonction affecte une multitude de variables dont le nombre est variable.
    Voici ci-dessous à nouveau un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function ModeModification(& $paramTableau) {
            foreach($paramTableau as $elementTableau) {
    		$elementTableau = stripslashes($elementTableau);
    	}
    }
     
    //je veux passer en référence mes variables, dans un tableau qui sera passé //par référence, compliqué non ? :lol:
    $tableau = array(& $esBD->commentaire1, ..., & $resBD->commentaireN);
    ModeModification($tableau);
    Il y a sans doute des erreurs, mais voyiez-vous ce que je souhaite faire ?


    Citation Envoyé par sabotage Voir le message
    Ca serait plutot comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach($paramTableau as $elementTableau) {
    		$elementTableau = stripslashes($elementTableau);
    	}
    Oui, Cela amène au même résultat en tous cas. C'est mieux écrit, on est d'accord.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    C'est marrant, en voyant des trucs du genre variable1, variable2... variableN, j'ai toujours des sueurs froides

    En faisant comme ça tu t'interdis l'utilisation de fonctions du genre array_map ou array_walk qui, à ce que j'en comprends, répondraient à ton problème.

    Peut-être que la chose à faire serait non pas de chercher à tordre PHP pour qu'il réponde à ton soucis, mais revoir un peu le code en amont.
    Pourfendeur de singletons en croisade

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Il y a sans doute des erreurs, mais voyiez-vous ce que je souhaite faire ?
    Il me semble que oui.
    Le principe, c'est que tu souhaite créer une fonction qui prendrait un tableau de N éléments, et qui seraient "traités" tour à tour, ceci dans le but de d'un affichage, ou avant un UPDATE, INSERT d'une Bdd, etc ...


    Pourquoi pas, et à priori ça devrait fonctionner.
    N'empêche que le passage par référence me semble pas une obligation, suffit de retourner le tableau une fois que les traitements seront fais.

    Puis, est ce que tu limite la fonction à 1 seul argument (1 tableau), ou N tableaux ?

    La seule restriction que je vois aussi, c'est que le tableau "passer" en argument et par référence sera ici limité à 1 dimension.
    Si tu souhaite passer un tableau à plus d'1 dimension, alors il faudra avoir recourt à la récursivité.


    Mais la question, est ce que tous les éléments devront être traités de la même manières, sans exception, est ce qu'il est certain qu'il n'y aura jamais d'exception ?

    Le truc qui me semble un peu dérangeant dans ce principe, c'est qu'il est jamais question du type de données, elles seront toutes considérées du même type, un string en l'occurrence.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  7. #7
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut
    oui, je m'interdis les array_walk et autre :-). C'est surtout que cela ne fait pas ce que je souhaite.

    Je passe par un tableau, mais si il y a une autre possibilité pas de souci.
    Je vais montrer ce que je ferai pour 1 élément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function ModeModification(& $paramTexte) {
       $paramTexte = stripslashes($paramTexte);
    }
     
    $blabla = "du texte\", en veux-tu, en voilà !";
    $blabla2 = "du texte\", en veux-tu, en voilà !";
    $blabla3 = "du texte\", en veux-tu, en voilà !";
    ModeModification($blabla);
    ModeModification($blabla2);
    ModeModification($blabla3);
    J'ai fait appel 3fois à ModeModification. Si j'ai n variables, je devrai le faire n fois. j'aimerai le faire 1 seule fois en fait. Un array_map qui stockerait des variables en référence (je sais, ca n'existe pas ) qui serait modifié dans la fonction.

  8. #8
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    La code de sabotage est correcte, il me semble.

    Si ça correspond à ce que tu recherche, à ton besoin, alors c'est bon.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  9. #9
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut
    non, ça ne correspond à ce que je souhaite.

    Regarde l'exemple que j'ai fait à 17h44. Ce n'est pas çà !

  10. #10
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    J'ai fais un essai vite fait, je remarque que malgré le passage par référence, les éléments du tableau ne sont pas modifiés.

    Je t'avoue que je n'est pas d'explication.

    Mais si on abandonne l'idée du passage par référence, mais qu'on retourne un nouveau tableau, ça marche.

    L'exemple simple que j'ai fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function ModeModification($param) {
    	foreach($param as $element) {
    		$tableau[] = 'modif-'.$element;
    	}
    	return $tableau;
    }
    //
    $tableau = array('element1', 'element2', 'element3');
    $tableau = ModeModification($tableau);
    print_r($tableau);
    Le print_r retourne :
    Array
    (
    [0] => modif-element1
    [1] => modif-elelement2
    [2] => modif-elelement3
    )

    Je vois bien que ce n'est pas la même chose, mais je ne vois pas comment faire autrement.
    A mon sens, ce qu'il te faudrait, c'est une fonction similaire à array_map, mais au lieu que ce soit N tableaux, ce serait N variables, c'est ça ?
    Si c'est ça, j'en ai pas connaissance
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  11. #11
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut
    Bonjour,

    ton exemple ne fait pas ce que je veux faire. Par contre, pour que les valeurs de ton tableau soit modifié, rajoute un & juste devant le paramètre déclaré dans ta déclaration de fonction.

    Oui, un array_map mais pour N variables où ce serait un passage par référence !
    J'ai l'impression que cela n'existe pas a priori.

  12. #12
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Il y a peut être quelque chose.

    Un exemple simple que j'ai fais (vite fait) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    function ma_function(&$maVar) {
    	foreach ($maVar as $key => $element) {
    		$maVar[$key] = 'modif-'.$element;
    	}
    }
     
    $var1 = 'chaine1';
    $var2 = 'chaine2';
    $var3 = 'chaine3';
    call_user_func('ma_function', array(&$var1, &$var2, &$var3));
     
    echo '$var1 : '.$var1.'<br />';
    echo '$var2 : '.$var2.'<br />';
    echo '$var3 : '.$var3.'<br />';
    les 3 echo retournent :
    $var1 : modif-chaine1
    $var2 : modif-chaine2
    $var3 : modif-chaine3

    -> Nombre illimité de variables
    -> Elles sont bien modifiées grâce au passage par référence.

    Qu'est ce t'en pense ?
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  13. #13
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut
    J'en pense que tu as tout bon "RunCodePhp" !

    J'avais utilisé "call_array_func" y a un moment, et effectivement, elle fait exactement ce que je souhaitais car elle passe bien les variables stockés dans un tableau, par référence.

    Merci beaucoup !

    A bientôt sur les forums.

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

Discussions similaires

  1. Appliquer une fonction sur plusieurs sélecteurs
    Par chlock62 dans le forum jQuery
    Réponses: 2
    Dernier message: 12/02/2014, 17h42
  2. Appliquer une fonction à plusieurs dossiers.
    Par MegaBigBoss dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/04/2008, 15h07
  3. Réponses: 0
    Dernier message: 26/07/2007, 15h22
  4. Réponses: 11
    Dernier message: 26/08/2006, 21h13
  5. Réponses: 7
    Dernier message: 15/02/2005, 13h55

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