Как использовать массив массивов с array_map (…) в PHP?

Функция 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(...)? (Это также относится к любой другой функции с переменным числом, которой я не могу манипулировать.)

2

Решение

Вы возвращаете массив массивов и хотите отобразить самые внутренние из этих массивов. Ты можешь использовать распаковка аргумента за это:

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']));
0

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

В крайнем случае используйте 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.

Увидеть это работает

-2

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