Как вызвать PHP анонимную функцию с другим порядком аргументов

Я хочу вызвать анонимную функцию (лямбда или замыкание), которая имеет несколько аргументов, я знаю имена аргументов, но я не знаю их порядок! Функция call_user_func_array () может вызывать функцию с массивом аргументов, но массив не может быть ассоциативным массивом для установки каждого значения для желаемого аргумента, следующие коды — мои попытки решить мою проблему, но они просто не работают!

Функция:

$function = function ($b, $c, $a) {
echo "a=" . $a . " & b=" . $b . " & c=" . $c;
};

Мой желаемый результат:

a=1 & b=2 & c=3

Мои попытки:

// Attempt 1
call_user_func_array($function, array("a" => 1, "b" => 2, "c" => 3));
// Attempt 2
$ref = new ReflectionFunction($function);
$ref->invokeArgs(array("a" => 1, "b" => 2, "c" => 3));

Выход продукции:

a=3 & b=1 & c=2

1

Решение

Вы должны передавать параметры позиционно, имена вообще не учитываются. Вы можете сопоставить параметры по имени с их положением, используя отражение:

$params = array("a" => 1, "b" => 2, "c" => 3);
$ref = new ReflectionFunction($function);

$arguments = array_map(
function (ReflectionParameter $param) use ($params) {
if (isset($params[$param->getName()])) {
return $params[$param->getName()];
}
if ($param->isOptional()) {
return $param->getDefaultValue();
}
throw new InvalidArgumentException('Missing parameter ' . $param->getName());
},
$ref->getParameters()
);

$ref->invokeArgs($arguments);
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]