我想将函数的参数转换为关联数组,其中键等于参数变量名,值等于参数值。

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

我该怎么做?

有帮助吗?

解决方案

您可以使用 compact 执行此操作:

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

或者, get_defined_vars() 将为您提供该范围内定义的所有变量的关联数组,这可能有效,但我认为这可能还包括 $ _ POST $ _ GET ,等...

否则,您可以使用 func_get_args 获取所有的列表传递给函数的参数。这是关联,因为它只是传递的数据(也就是说,没有变量名称)。这也允许你在函数中有任意数量的参数。

或者,只需指定一个参数,即一个数组:

function myFunc($params) {

}

compact()似乎最接近您所追求的目标。

其他提示

get_defined_vars()是您在函数内部调用之前未定义其他变量所需的内容(您可以通过使它成为你在函数内部做的第一件事来确保这一点。

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

我赞成@ nickf的答案但是想补充一点,compact()也是使用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;
    }
}

确保params与字段具有完全相同的拼写。

按照建议,但未实施:您可以使用 Reflection 收集参数名称,然后将这些名称与值相关联:

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

然后你可以用同样的方式调用它,无论是在函数还是方法中:

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

哪些输出

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

我没有计时,但我强烈怀疑这比使用 compact 慢得多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top