Nasıl bir ilişkisel dizi için bir PHP işlevin parametre listesi dönüştürebilirsiniz?

3 Cevap php

Ben parametre değişken isimleri eşit tuşları ve parametre değerleri eşit değerler ile bir associative array içine bir işleve argümanlar dönüştürmek istiyorum.

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

Bunu nasıl yapabilirim?

3 Cevap

Kullanarak bunu yapabilirsiniz compact :

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

Ya da, get_defined_vars() will give you an associative array of all the variables defined in that scope, which would work, but I think this might also include $_POST, $_GET, vs ..

Geçirilmeden, sadece veri olduğundan Aksi takdirde, (hiçbir değişken isimleri, orada olduğu), olsa func_get_args to get a list of all the arguments passed to the function. This is not çağrışımlı kullanabilirsiniz. Bu da size işlevi herhangi bir sayıda argüman var sağlar.

Ya da, sadece bir dizi olan bir argüman belirtin:

function myFunc($params) {

}

compact() Eğer olsa sonra ne konum yakın gibi görünüyor.

get_defined_vars() başka hiçbir vars kendi işlevi içinde denir önce tanımlanır eğer gerekenler (Eğer işlev içinde yapılacak ilk şey yaparak bu sağlayabilirsiniz).

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

Ben nickf cevabı @ upvoted ama compact () aynı zamanda bir ctor kullanarak bir model örneğini için harika bir yol olduğunu eklemek istiyorum:

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

Sadece params alanları olarak aynı yazım var olduğundan emin olun.