Нелогичное поведение call_user_func_array

253
30 ноября 2017, 03:08

Почему вот этот код:

var_dump(call_user_func_array('in_array', [1 => [1,2,3], 0 => 2]));

ругается "Warning: in_array() expects parameter 2 to be array, integer given" ?

Там же передается массив в call_user_func_array. Разве она не должна сопоставлять и индексы тоже? Я специально поменял местами аргументы, но поставил правильные индексы чтобы это проверить.

P.S. Обнаружил это когда пытался реализовать каррирование. Взял пример из этой статьи. Вот пример из реального кода что я хотел сделать (данные только другие):

$a = [1, 2, 3];
$b = [4, 1, 5, 3];
// код функции curry есть в статье
var_dump(array_filter($b, curry('in_array', [1 => $a])));

Это короче чем писать анонимную функцию (ох как же мне не хватает стрелочных лямбд...). Но ведь не работает. :( А все потому что call_user_func_array не хочет сопоставлять индексы.

Answer 1

Немного переделал реализацию каррирующей функции из статьи и заработало.

function curry($callback, $args = []) {
    $num = (new ReflectionFunction($callback))->getNumberOfParameters();
    return function() use($callback, $num, $args) {
        $args = $args + func_get_args();
        ksort($args);
        return count($args) < $num ? curry($callback, $args) : call_user_func_array($callback, $args);
    };
}

Оказывается array_merge (который был в оригинале) не сохраняет ключи. А через простое сложение массивов все сохраняется. :D Плюс еще сортировку по ключам добавил, раз уж оно само не умеет.

READ ALSO
SOAP добавить 2-ой input!

SOAP добавить 2-ой input!

Делаю сервис, который возвращает ответ в StringПроблема в том что, если я сделаю функцию с 1 инпутом и ввожу 1 инпут, то все работает, а когда хочу...

243
Запуск bat файла из PHP

Запуск bat файла из PHP

Здравствуйте дорогие друзья, очередной вопрос из серии "ИЗВРАЩЕНИЕ"Можно ли (если да то каким образом) можно запустить внешний

290
Форматирование стектрейса

Форматирование стектрейса

Очень раздражают плохочитабельные стектрейсыЯ бы хотел:

282