cbulock
cbulock

Reputation: 91

Pass Associative Array to Function in PHP

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

Answers (4)

Xnoise
Xnoise

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

user3638471
user3638471

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

Gary
Gary

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

Barif
Barif

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

Related Questions