Hvordan kan jeg konvertere en PHP-funksjonen parameter liste til en assosiativ array?

stemmer
5

Jeg ønsker å konvertere argumentene til en funksjon i et assosiativ array med nøkler lik parametervariabelnavn og verdier lik parameterverdier.

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

Hvordan kan jeg gjøre dette?

Publisert på 14/09/2009 klokken 02:38
kilden bruker
På andre språk...                            


4 svar

stemmer
10

Det du kan gjøre dette ved hjelp av compact:

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

Eller, get_defined_vars()vil gi deg en assosiativ array av alle variablene som er definert i det omfang som ville fungere, men jeg tror dette kan også omfatte $_POST, $_GETosv ...

Ellers kan du bruke func_get_argsfor å få en liste over alle de argumenter som sendes til funksjonen. Dette er ikke assosiativ skjønt, siden det er bare data som er sendt (det vil si, det er ingen variabelnavn). Dette kan du også ha en rekke argumenter i funksjon.

Eller, bare angi ett argument, som er en matrise:

function myFunc($params) {

}

compact() synes å være nærmest det du leter etter skjønt.

Svarte 14/09/2009 kl. 02:46
kilden bruker

stemmer
7

get_defined_vars () er hva du trenger hvis ingen andre vars er definert før det kalles inne funksjonen (du kan sikre dette ved å gjøre det er det første du gjør inne i funksjon).

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)
}
Svarte 14/09/2009 kl. 04:51
kilden bruker

stemmer
1

Jeg upvoted @ nickf svar, men ønsker å legge til at det kompakte () er også en fin måte på å bruke en modell med en 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;
    }
}

Bare sørg for at de params har nøyaktig samme stavemåte som feltene.

Svarte 09/04/2014 kl. 22:25
kilden bruker

stemmer
1

Som det har blitt foreslått, men ikke iverksatt: du kan bruke Reflectiontil å samle parameternavn, deretter knytte de med de verdier:

function args_to_assoc_array($function, $args) {                                 
    if (false === strpos($function, '::')) {                                     
        $reflection = new ReflectionFunction($function);                         
    } else {                                                                     
        $reflection = new ReflectionMethod(...explode('::', $function));         
    }                                                                            
    $assoc = [];                                                                 
    foreach ($reflection->getParameters() as $i => $parameter) {                 
        $assoc[$parameter->getName()] = $args[$i];                               
    }                                                                            
    return $assoc;                                                               
}                                                                                

Deretter kan du ringe dette på samme måte, enten i en funksjon eller en metode:

function f($x, $y) { return args_to_assoc_array(__METHOD__, func_get_args()); }
class A {                                                                     
    function m($z) { return args_to_assoc_array(__METHOD__, func_get_args()); }
}                                                                             
var_dump(f(7, 2), (new A)->m(4));                                             

som sender ut :

array(2) {
  ["x"]=>
  int(7)
  ["y"]=>
  int(2)
}
array(1) {
  ["z"]=>
  int(4)
}

Jeg har ikke timet det, men jeg sterkt mistenker at dette er mye tregere enn å bruke compact.

Svarte 12/12/2018 kl. 05:19
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more