Reputation: 91
I'm curious to know if there is some way to call a function using an associative array to declare the parameters.
For instance if I have this function:
function test($hello, $world) {
echo $hello . $world;
}
Is there some way to call it doing something like this?
call('test', array('hello' => 'First value', 'world' => 'Second value'));
I'm familiar with using call_user_func
and call_user_func_array
, but I'm looking for something more generic that I can use to call various methods when I don't know what parameters they are looking for ahead of time.
Edit: The reason for this is to make a single interface for an API front end. I'm accepting JSON and converting that into an array. So, I'd like different methods to be called and pass the values from the JSON input into the methods. Since I want to be able to call an assortment of different methods from this interface, I want a way to pass parameters to the functions without knowing what order they need to be in. I'm thinking using reflections will get me the results I'm looking for.
Upvotes: 9
Views: 13897
Reputation: 522
Check the php manual for call_user_func_array
Also, look up token operator (...). It is a way to use varargs with functions in PHP. You can declare something like this: -
function func( ...$params)
{
echo $params[0] . ',' . parama[1];
}
Upvotes: 3
Reputation:
The following should work ...
function test($hello, $world) {
echo $hello . $world;
}
$callback = 'test'; <-- lambdas also work here, BTW
$parameters = array('hello' => 'First value', 'world' => 'Second value');
$reflection = new ReflectionFunction($callback);
$new_parameters = array();
foreach ($reflection->getParameters() as $parameter) {
$new_parameters[] = $parameters[$parameter->name];
}
$parameters = $new_parameters;
call_user_func_array($callback, $parameters);
Upvotes: 1
Reputation: 13912
With PHP 5.4+, this works
function test($assocArr){
foreach( $assocArr as $key=>$value ){
echo $key . ' ' . $value . ' ';
}
}
test(['hello'=>'world', 'lorem'=>'ipsum']);
Upvotes: 4
Reputation: 1552
You can use this function internal in your functions func_get_args()
So, you can use it like this one:
function test() {
$arg_list = func_get_args();
echo $arg_list[0].' '.$arg_list[1];
}
test('hello', 'world');
Upvotes: 2