PHPでは、変数を配列として渡すか、それぞれに個別の変数として渡す方がよいでしょうか。
つまり、30個の連想配列のうち、おそらく5個の変数を使用する場合はどうでしょうか。それらを5つの変数として個別に渡すか、配列全体を渡す方がよいでしょうか。
一般的に言えば、関数の定義方法を選択する際に考慮すべきことがいくつかあります。これはあなたの質問に直接答えることはできないかもしれませんが、ある方法を別の方法よりも選択する理由と、それらがさまざまなことに適している理由を提供する可能性があります。
function do_something($a, $b, $c, $d, $e) {
...
}
function do_something(array $a) {
...
}
まず第一に、セマンティクスがあります。あなたの関数はその特定の配列に依存していますか、それともあなたが渡す引数がその場合にたまたま配列にあるというだけですか?
配列に依存している場合は、それを唯一の引数として渡すのが妥当であり、他の場合には使用しないため、コードは読み取り可能なままです。
function do_something_to_big_array($big_array) {
....
}
それが具体的でない場合は、問題が発生する可能性があります。
関数はあいまい になります。配列に含まれている必要のある要素を見つけるために関数を読み取らなければ、この関数を使用することはできません。
関数はより複雑になり ます。定義にデフォルト値を含むデフォルト配列を指定できますが、引数を指定するときにそれは使用されません。標準の引数リストを再実装しようとしたり、キーが存在するかどうかを確認したり、存在しない場合は設定したりすることに気付くでしょう。
// default array if no argument supplied
function do_something($a = array('a' => true, 'b' => 10, 'c' => false)) {
// you don't know if you're working with the default or not
if (!isset($a['c'])) $a['c'] = false;
...
}
// define a defaults array and replace duplicates with $a's values
function do_something(array $a) {
$defaults = array('a' => true, 'b' => 10, 'c' => false);
$a = array_replace($defaults, $a);
}
// have defaults without extra logic in the function
function do_something($a = true, $b = 10, $c = false) {
...
}
宣言するすべての関数に対してこれを実行する必要があると想像してください。そうすれば、個別の引数の代わりに、配列を渡して確実に機能させることができます。
読みやすさが損なわれます。さらに煩雑: 関数に渡す必要のあるすべてのデータがありますが、使用する前に、そのデータを含む連想配列を作成する必要があります。
$data = array('a' => $a, 'b' => $b, 'c' => $c);
do_something($data);
もちろん、常に例外があり、大きな引数リストがあることに気付くかもしれません。
function do_something($a, $b, $c, ... $x, $y, $z) {
...
}
これは不合理であり、リファクタリングが必要です。そのため、配列を渡してそれを操作することができます。これは、他の場合には使用しないためです。
function do_something_with_alphabet(array $alphabet) {
...
}
または、そうすることが合理的である場合は、それをより多くの関数に分割することができます。
function do_something_first($a, $b, $c) {
...
}
function do_something_last($x, $y, $z) {
...
}
このように、またはそのように、あるいは他の方法でそれを行わなければならないという意味はありませんが、ある状況で関数を記述し、その後、あなた(または他の誰か)が再作成する可能性があるため、覚えておく価値があります。何ヶ月も後にそれを訪れて、何が起こっているのか理解するのに苦労します。単一の配列を関数に渡すことが絶対的に理にかなっている場合は、それだけです。そうでない場合、そしてそれが便宜のためであるならば、それからそれについてもう少し考えてください。