9

関数の引数を、キーがパラメーター変数名に等しく、値がパラメーター値に等しい連想配列に変換したいと考えています。

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

5 に答える 5

12

次を使用してこれを行うことができますcompact

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

または、そのスコープで定義されたすべての変数の連想配列を提供しますが、これは機能しますが、これには、などget_defined_vars()が含まれる可能性があると思います...$_POST$_GET

それ以外の場合はfunc_get_args、関数に渡されたすべての引数のリストを取得するために使用できます。ただし、渡されるのはデータのみであるため (つまり、変数名がないため)、これは連想ではありません。これにより、関数に任意の数の引数を含めることもできます。

または、配列である 1 つの引数を指定するだけです。

function myFunc($params) {

}

compact()あなたが求めているものに最も近いようです。

于 2009-09-14T02:46:24.137 に答える
9

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)
}
于 2009-09-14T04:51:18.143 に答える
4

私は@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;
    }
}

パラメータのスペルがフィールドとまったく同じであることを確認してください。

于 2014-04-09T22:25:07.573 に答える
1

提案されていますが、実装されていません: を使用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ます。

于 2018-12-12T05:19:00.710 に答える