Функция PHP array_map(...)
ожидает обратного вызова в качестве первого параметра (или null
за создание массива массивов) и переменное количество аргументов массива, например:
$foo => array_map(null, $bar, $buz);
Теперь у меня есть случай, когда мне нужно перейти на array_map(...)
переменное количество массивов. Я не могу жестко закодировать это, так как массивы для array_map(...)
Входные данные генерируются динамически.
function performSomeLogicAndGetArgumentsForMyFunction() {
...
return ['bar' => [...], 'buz' => [...]];
}
$foo = array_map(null, performSomeLogicAndGetArgumentsForMyFunction());
Так не работает, так как array_map(...)
надеется переменный номер массива и не массив массивов.
Есть ли решение для этого? Как я могу сохранить гибкость вызова и передать переменное число аргументов array_map(...)
? (Это также относится к любой другой функции с переменным числом, которой я не могу манипулировать.)
Вы возвращаете массив массивов и хотите отобразить самые внутренние из этих массивов. Ты можешь использовать распаковка аргумента за это:
function say($n, $m) {
return "The number $n is called $m in Spanish";
}
function arrays() {
return [
[ 1, 2, 3 ],
[ 'uno', 'dos', 'tres' ],
];
}
print_r(
array_map('say', ...arrays())
);
Смотрите это онлайн на 3v4l.org.
В качестве альтернативы, вы можете использовать call_user_func_array
как упоминалось в RFC при измеримой стоимости выполнения:
print_r(
call_user_func_array(
'array_map',
array_merge(array ('say'), arrays())
)
);
Смотрите это онлайн на 3v4l.org.
Любой из этих шаблонов может реализовывать различные формы общих методов. Например, подражать vsprintf
можно использовать:
sprintf('%s %s', ...['Hello', 'World']);
call_user_func_array('sprintf', array_merge(['%s, %s'], ['Hello', 'World']));
В крайнем случае используйте Eval
//build you array of array variable names with the dynamic content coming in.
$arrays = ['$foo', '$bar', '$baz'];
$str = implode(', ', $arrays);
eval("\$map = array_map(null, $str);");
print_r($map);
Остерегайтесь никогда не посылать необработанные данные в eval.