2009-09-14 3 views
5

引数を関数に変換するには、連想配列にキーをパラメータ変数名に、パラメータ値と同じ値にします。PHP関数のパラメータリストを連想配列に変換するにはどうすればよいですか?

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

私はこれをどのように行うことができますか?

+0

最初の引数として配列を受け入れて配列を供給するための初期関数を定義するだけの理由はありますか? –

+1

meder:それは1)醜いAPIを提供し、2)呼び出し元に多くの変更を必要とします。これらの機能の多くはすでに存在し、呼び出されています。 – Fragsworth

+1

私は本当になぜ「醜い」APIになるのか分かりません。私には、Pythonの引数として辞書を供給し、ECMAScriptでオブジェクトを供給するのと同じように、より洗練されたものになります。 –

答えて

10

ザ・あなたがcompactを使用してこの操作を行うことができます。

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

または、get_defined_vars()はあなたに働くだろうそのスコープで定義されているすべての変数の連想配列を与えるだろうが、私はこれも$_POSTを含めるかもしれないと思います、 $_GETなど

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

それとも、単なる配列である一つの引数を指定:

function myFunc($params) { 

} 

compact()は、しかし、あなたが後にしているものに最も近いと思われます。

+0

私はこれが好きではない理由は、変数名を繰り返す必要があるからです。 – Fragsworth

+1

'get_defined_vars'を見てください。 – nickf

7

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

私はこれを何年も使っていたはずです。正しい答え。 – user3751385

1

私はnickfの答え@ upvotedけど)(つまりコンパクトでも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を持っていることを確認してくださいフィールドとまったく同じスペル。

+0

私が探していたものではなく、upvoteを正当化するのに十分なトリックです。 – user3751385

関連する問題