2016-09-20 2 views
2

PHP-функция array_map(...) ожидает обратного вызова в качестве первого параметра (или null для creating an array of arrays) и переменное число аргументов массива, например:Как использовать массив массивов с array_map (...) в PHP?

$foo => array_map(null, $bar, $buz); 

Теперь у меня есть случай, когда мне нужно пройти array_map(...) переменную количество массивов. Я не могу это сделать, потому что массивы для ввода array_map(...) генерируются динамически.

function performSomeLogicAndGetArgumentsForMyFunction() { 
    ... 
    return ['bar' => [...], 'buz' => [...]]; 
} 
$foo = array_map(null, performSomeLogicAndGetArgumentsForMyFunction()); 

Это не работает таким образом, так как array_map(...) ожидает переменное число массива и не массив массивов.

Есть ли решение для этого? Как сохранить гибкость вызова и передать переменное количество аргументов в array_map(...)? (Это также относится и к любой другой VARIADIC функции я не могу манипулировать.)

+1

Посмотрите на 'call_user_func_array()' – Rizier123

+0

Спасибо, ребята! Да, конечно, это просто массив, и его можно легко распаковать/повторить. – automatix

+0

Извините, я сформулировал вопрос неправильно. Проблема состоит в том, что на самом деле возникает «повторная передача» аргументов, например. к 'array_map (...)'. Я только что редактировал вопрос. – automatix

ответ

-2

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

See it working

+0

Это рабочий код, который был протестирован, и он отвечает на вопрос о переносе переменной количества неизвестных массивов в функцию array_map. Если вы голосуете, по крайней мере, оставляйте комментарий, объясняющий почему. – dlporter98

0

Вы возвращаете массив массивов, и вы хотите отобразить над сокровенным этими массивами. Вы можете использовать argument unpacking для этого:

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()) 
); 

See it online at 3v4l.org.

В качестве альтернативы, вы можете использовать call_user_func_array как упомянуто в RFC в измеримой стоимости времени выполнения:

print_r(
    call_user_func_array(
     'array_map', 
     array_merge(array ('say'), arrays()) 
    ) 
); 

See it online at 3v4l.org.

Любой из этих шаблонов может реализовывать вариативные формы общих методов. Например, чтобы эмулировать vsprintf можно использовать:

sprintf('%s %s', ...['Hello', 'World']); 
call_user_func_array('sprintf', array_merge(['%s, %s'], ['Hello', 'World']));