2009-09-14 21 views
5

Quiero convertir los argumentos en una función en una matriz asociativa con claves iguales a los nombres de las variables de parámetros y valores iguales a los valores de los parámetros.¿Cómo puedo convertir la lista de parámetros de una función de PHP a una matriz asociativa?

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) 
} 

¿Cómo puedo hacer esto?

+0

¿Hay alguna razón por la que no pueda definir la función inicial para aceptar una matriz como primer argumento y alimentar una matriz? –

+1

meder: Eso 1) proporcionaría una API fea, y 2) requeriría muchos cambios al origen de la llamada. Muchas de estas funciones ya existen y están siendo llamadas. – Fragsworth

+1

Realmente no veo por qué sería una API "fea": para mí sería más limpio y similar a alimentar diccionarios como argumentos en Python y alimentar objetos en ECMAScript. –

Respuesta

10

El puede hacer esto utilizando compact:

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

O get_defined_vars() le dará una matriz asociativa de todas las variables definidas en ese ámbito, que funcionaría, pero creo que esto también podría incluir $_POST, $_GET, etc ...

De lo contrario, puede usar func_get_args para obtener una lista de todos los argumentos pasados ​​a la función. Esto es no asociativo, ya que solo se pasan los datos (es decir, no hay nombres de variables). Esto también le permite tener una cantidad de argumentos en su función.

O, simplemente, especificar un argumento, que es una matriz:

function myFunc($params) { 

} 

compact() parece ser más cercano a lo que está buscando sin embargo.

+0

La razón por la que no me gusta esto es porque los nombres de las variables deben repetirse. – Fragsworth

+1

mira 'get_defined_vars' luego. – nickf

7

get_defined_vars() es lo que necesita si no se define ningún otro vars antes de que se llame dentro de la función (esto puede garantizarse haciendo que sea lo primero que haga dentro de la función).

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

Debería haber estado usando esto por años. La respuesta correcta. – user3751385

1

I upvoted @ respuesta de nickf pero me gustaría añadir que esa compacta() es también una gran manera de crear una instancia de un modelo utilizando un ctor:

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; 
    } 
} 

Sólo asegúrese de que los parametros tienen la exactamente la misma ortografía que los campos.

+0

No es lo que estaba buscando, pero sigue siendo un truco lo suficientemente bueno para justificar un voto positivo. – user3751385

Cuestiones relacionadas