Как преобразовать список параметров функции 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) } 

Как я могу это сделать?

Вы можете сделать это с помощью 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 () – это то, что вам нужно, если никакие другие 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; } } 

Просто убедитесь, что параметры имеют то же самое правописание, что и поля.