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 :

Convertir un tableau en paramètre de fonction


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut Convertir un tableau en paramètre de fonction
    Bonjour à tous,

    Je me trouve confronté à un petit problème, je dois convertir un tableau en paramètre de fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function f1($param){
    	f2($n1, $n2, $n3);
    }
    $param est un tableau
    à partir de $param, je dois retrouvé $n1, $n2 ... autant de paramètres qu'il y a d'éléments dans le tableau, car, c'est bien la le problème, c'est que le nombre d'éléments dans le tableau est variable, donc le nombre de paramètres à passer dans f2 est également variable.

    Comment puis-je faire ceci ?

    Merci d'avance pour votre coup de main

    Cyril

  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
    Une solution pourrait être de fixer les paramètres par défaut et de les remplacer par les valeurs de $param quand elles existent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $f2_param = array(NULL, 0, "abcd", NULL);
     
    foreach($param as $key=>$value) {
       $f2_param[$key] = $value;
    }
     
    f2($f2_param[0], $f2_param[1], $f2_param[2], $f2_param[3]);
    Cela reste du bidouillage pas très propre.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu as regardé du côté de call_user_func() | call_user_func_array() | func_get_args()?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 496
    Points : 585
    Points
    585
    Par défaut
    Salut,

    Pourquoi ne pas utiliser un tableau comme paramètre de f2?

  5. #5
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Si les arguments sont du même type, je suis de l'avis billoum.

    Sinon call_user_func_array() est parfait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function f2() {
        foreach (func_get_args() as $key => $value) {
            echo "L'argument ".$key." est : ". $value."<br />\n";
        }
    }
     
    function f1($param) {
        call_user_func_array('f2', $param);
    }
     
    $param = array(0, 'a', null, false);
     
    f1($param);
    Au passage si "f1" ne fait que ça, autant appeler directement f2 ^^
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    merci pour vos réponses, c'est cooool

    je ne suis pas certain de bien vous comprendre, si ce n'est Sabotage !! d'ailleurs, même si ce n'est pas très propre je suis parti de cette idée, même si je te l'accorde, c'est du bidouillage.
    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
    16
    17
    18
    19
    20
    21
    22
    $numargs = count ($param);
    switch ($numargs) 
    {
        case 0:
            $r = $c->$method();
            break;
        case 1:
            $r = $c->$method($param[0]);
            break;
        case 2:
            $r = $c->$method($param[0], $param[1]);
            break;
        case 3:
            $r = $c->$method($param[0], $param[1], $param[2]);
            break;	
        case 4:
            $r = $c->$method($param[0], $param[1], $param[2], $param[3]);
            break;		
        ...
        default:
           break;
    }
    je fais la exactement ce que je souhaitais éviter !!! pour la simple raison est que je ne couvre pas tous les cas !!
    pour préciser, il se trouve que f2 est en fait une variable contenant le nom de la fonction à appeler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    f1($f2, $param)
    {
        $f2 (...);
    }
     
    f1("une_function", array("param1", "param2"));
    f1("une_autre_function", array("param1", "param2", "param3", "param4"));
    C'est la raison pour laquelle, je ne sais pas exactement le nombre de paramètre dans le fonction f2.
    Et c'est aussi la raison pour laquelle Spartacusply ta solution ne peut fonctionner, je ne peux pas et ne dois pas intervenir dans les fonctions f2, mais simplement les appeler.

    Il me faut donc une astuce pour récupérer le contenu de param le passer en paramètre de f2 !!! et la ->

  7. #7
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Ma solution marche aussi si "f2" est une fonction variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function f2() {
        foreach (func_get_args() as $key => $value) {
            echo "L'argument ".$key." est : ". $value."<br />\n";
        }
    }
     
    function f1($function,$param) {
        call_user_func_array($function, $param);
    }
     
    $param = array(0, 'a', null, false);
     
    f1('f2',$param);
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  8. #8
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Ceci dit en y repensant je me dis qu'il y a un soucis à la base dans ta manière de procéder.

    Si tu as vraiment un nombre illimité d'argument pour ta fonction, tu dois passer par un tableau. Je ne vois aucun cas qui nécessiterait absolument de passer les arguments les uns à la suite des autres. Où alors il faut que tu précises exactement quels sont les arguments que tu as et de quels types sont-ils. Les bouts de code que tu mets là ne le nécessite pas.



    PS : il y a toujours la solution d'"eval" mais elle pour moi complètement inenvisageable.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    Ah crotte, je n'avais pas compris, je pensais que je devais modifier le contenu de f2, mais effectivement ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function f2($n, $n2) {
    	echo $n." ".$n2;
    }
     
    function f1($function,$param) {
        call_user_func_array($function, $param);
    }
     
    $param = array(0, 'a', null, false);
     
    f1('f2',$param);

    HOUUUURAAA
    merci les amis

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    j'ai tout de même un p'tit souci avec call_user_func_array, c'est que je ne trouve pas le moyen de faire un appel à ma classe autre que par la méthode static

    je m'explique :
    f2 est une classe de C2, je dois donc faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $c = new C2 ();
    $r = call_user_func_array($c->f2, $param);
    mais ceci n'est pas possible, il me faut passer une chaine de caractère dans la callback.

    je fais un appel static
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $r = call_user_func_array('C2::f2', $param);
    mais malheureusement, dans f2, je fais appel à une variable de la classe ($this->mavariable)

    Je ne peux donc pas utiliser la méthode static et du coup ... je me prends un nouveau poteau !!

    et si je re-ouvre ce topic, c'est parce en lisant ceci http://www.thedarksideofthewebblog.c...ucteur-en-php/, je pense que la solution trouvé n'est pas bonne dans mon cas

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 496
    Points : 585
    Points
    585
    Par défaut
    Su la page du manuel de call_user_func_array il y a un exemple avec une méthode de classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class foo {
        function bar($arg, $arg2) {
            echo __METHOD__, " got $arg and $arg2\n";
        }
    }
    $foo = new foo;
    call_user_func_array(array($foo, "bar"), array("three", "four"));

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Points : 27
    Points
    27
    Par défaut
    ah flute je l'avais raté
    merci billoum et bonne soirée à tous

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 31/03/2010, 16h19
  2. Appel de tableau en paramètres de fonction
    Par Linkin dans le forum Langage
    Réponses: 8
    Dernier message: 30/04/2008, 11h23
  3. c++ vers c# tableau comme paramétres de fonction
    Par punto dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/03/2008, 11h21
  4. tableau en paramètre de fonction
    Par tom31 dans le forum C
    Réponses: 1
    Dernier message: 09/02/2008, 08h55
  5. Tableau en paramêtre de fonction
    Par LeSkaMan dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/01/2007, 11h14

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