2016-09-20 6 views
2

PHP関数array_map(...)は、例えば、最初のパラメータ(またはcreating an array of arraysnull)および配列引数の可変数としてコールバックを期待:PHPでarray_map(...)を使って配列の配列を使うには?

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

今私はarray_map(...)に変数を渡す必要があるケースを有します配列の数。 array_map(...)の配列の配列は動的に生成されるので、これをハードコードすることはできません。

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

array_map(...)が配列の配列の可変数ではなくアレイを期待するので、それは、このように動作しません。

解決方法はありますか? コールを柔軟に保ち、可変数の引数をarray_map(...)に渡すにはどうすればよいですか?(それはまた、私は操作できません他のすべての可変引数関数に適用されます。)最後の手段として

+1

を' – Rizier123

+0

は皆さんありがとう:たとえば、vsprintfをエミュレートするために1を使用することができます!はい、確かに、それは単なる配列であり、容易にアンパック/反復することができます。 – automatix

+0

申し訳ありませんが、私は間違った質問を策定しました。問題は実際には引数を「再渡す」ことです。 'array_map(...)'に渡します。私はちょうど質問を編集しました。 – automatix

答えて

-2

、evalのに未消毒の入力を送信しないように注意してください決して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); 

を使用しています。

See it working

+0

これはテストされた動作コードであり、未知の配列の可変数をarray_map関数に渡すという質問に答えます。理由を説明するコメントを残して投票してください。 – dlporter98

0

あなたは、配列の配列を返すしている、とあなたはそれらの配列の最も内側の上にマップします。

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

See it online at 3v4l.org.

:測定可能な実行時のコストでRFCに述べたように、あなたがcall_user_func_arrayを使用することができ、また

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.

:あなたはこのためにargument unpackingを使用することができますこれらのパターンのいずれかは、一般的な方法の多様な形態を実装することができる。 )(call_user_func_array `を見てみましょう

sprintf('%s %s', ...['Hello', 'World']); 
call_user_func_array('sprintf', array_merge(['%s, %s'], ['Hello', 'World'])); 
関連する問題