代码之家  ›  专栏  ›  技术社区  ›  Fragsworth

如何将PHP函数的参数列表转换为关联数组?

  •  8
  • Fragsworth  · 技术社区  · 17 年前

    我要将参数转换为函数 联合数组 键等于参数变量名,值等于参数值。

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

    我该怎么做?

    4 回复  |  直到 17 年前
        1
  •  12
  •   nickf    17 年前

    你可以用 compact :

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

    或者, get_defined_vars() 将为您提供一个在该范围中定义的所有变量的关联数组,它将起作用,但我认为这也可能包括 $_POST ,请 $_GET 等。

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

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

    function myFunc($params) {
    
    }
    

    compact() 但似乎最接近你想要的。

        2
  •  9
  •   Sandeep Shetty    17 年前

    get_defined_vars() 如果在函数内部调用之前没有定义其他var,则需要这样做(您可以通过使它成为函数内部的第一件事情来确保这一点)。

    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)
    }
    
        3
  •  2
  •   Michael M    11 年前

    我反对@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;
        }
    }
    

    只需确保参数的拼写与字段完全相同。

        4
  •  1
  •   bishop    7 年前

    如前所述,但未实现:您可以使用 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));                                             
    

    which outputs :

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

    我没有计时,但我强烈怀疑这比使用 compact .

    推荐文章