2009-09-14 6 views
5

Je souhaite convertir les arguments en une fonction dans un tableau associatif avec des clés égales aux noms des variables de paramètres et des valeurs égales aux valeurs des paramètres.Comment puis-je convertir la liste de paramètres d'une fonction PHP en un tableau associatif?

PHP:

function my_function($a, $b, $c) { 

    // <--- magic goes here to create the $params array 

    var_dump($params['a'] === $a); // Should result in bool(true) 
    var_dump($params['b'] === $b); // Should result in bool(true) 
    var_dump($params['c'] === $c); // Should result in bool(true) 
} 

Comment puis-je faire cela?

+0

Y a-t-il une raison pour laquelle vous ne pouvez pas simplement définir la fonction initiale pour accepter un tableau comme premier argument et alimenter un tableau? –

+1

meder: Ce serait 1) fournir une API moche, et 2) nécessitent beaucoup de changements à l'appel de la source. Beaucoup de ces fonctions existent déjà et sont appelées. – Fragsworth

+1

Je ne vois pas vraiment pourquoi ce serait une API "moche" - pour moi, cela serait plus propre et s'apparenterait à nourrir des dictionnaires comme des arguments dans Python et à nourrir des objets dans ECMAScript. –

Répondre

10

Le vous pouvez le faire en utilisant compact:

function myFunc($a, $b, $c) { 
    $params = compact('a', 'b', 'c'); 
    // ... 
} 

Ou, get_defined_vars() vous donnera un tableau associatif de toutes les variables définies dans ce cadre, qui fonctionnerait, mais je pense que cela pourrait aussi inclure $_POST, $_GET, etc ...

Sinon, vous pouvez utiliser func_get_args pour obtenir une liste de tous les arguments transmis à la fonction. Ceci est pas cependant, puisque ce sont seulement les données qui sont passées (c'est-à-dire, il n'y a pas de noms de variables). Cela vous permet également d'avoir un certain nombre d'arguments dans votre fonction.

Ou, il suffit de spécifier un argument, qui est un tableau:

function myFunc($params) { 

} 

compact() semble être le plus proche de ce que vous êtes après bien.

+0

La raison pour laquelle je n'aime pas cela est que les noms de variables doivent être répétés. – Fragsworth

+1

regardez ensuite 'get_defined_vars'. – nickf

7

get_defined_vars() est ce dont vous avez besoin si aucun autre vars n'est défini avant son appel à l'intérieur de la fonction (vous pouvez en assurer la première chose que vous faites dans la fonction).

function my_function($a, $b, $c) { 

    $params = get_defined_vars(); // <--- create the $params array 

    var_dump($params['a'] === $a); // results in bool(true) 
    var_dump($params['b'] === $b); // results in bool(true) 
    var_dump($params['c'] === $c); // results in bool(true) 
} 
+0

J'aurais dû l'utiliser pendant des années. La bonne réponse – user3751385

1

J'upvoted @ la réponse de nickf mais je voudrais ajouter que ce compact() est aussi un excellent moyen d'instancier un modèle en utilisant un cteur:

class User { 
    public $email; 
    public $password; 
    public $firstName; 
    public $lastName; 

    public function __construct ($email, $password, $firstName, $lastName) 
    { 
     foreach (compact(array_keys((array)$this)) as $k => $v) 
      $this->$k = $v; 
    } 
} 

Assurez-vous que les params ont la exactement la même orthographe que les champs.

+0

Pas ce que je cherchais - mais encore un truc assez cool pour justifier un upvote. – user3751385

Questions connexes