• ベストアンサー

php 省略可能な引数配列を持つ関数の作り方

phpの関数で、省略する引数の右側の引数は全て省略しないといけませんが、連想配列を用いて、省略する順番が不確定で、必要な引数のみを設定して、省略したものはデフォルト値を使用するような関数を作るにはどのようにすればいいでしょうか。 ご教授のほどよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.5

「基本的にはデフォルト値」ということであれば、引数は無しとして、関数内にてfunc_get_argsで投げられた引数を取得すればよいかと。 function setParam(){ //初期値 $param = array('aaa'=>'AAA','bbb'=>'BBB','ccc'=>'CCC'); //渡された引数を取得 $args = func_get_args(); //指定ありの時は引数の1個目つまり[0]に連想配列が来るので$arg[0]で判定 if(count($args[0])){ $param = array_merge($param,$args[0]); } return $param; } ※もし引数があまりに多いようでしたら、個人的にはclassにする方をおすすめしますが・・・

ixkaito
質問者

お礼

再度ご回答ありがとうございます。 なるほどこういうやり方もあるんですね。 実は先ほどの補足後に自己解決しまして、下記のようにしたところ、 function setParam($param=array()){ //初期値 $def = array('aaa'=>'AAA','bbb'=>'BBB','ccc'=>'CCC'); //初期値と引数マージ $set = array_merge($def,$param); echo $set['aaa']; echo $set['bbb']; echo $set['ccc']; } setParam();で問題なく初期値を出力できました。 補足やお礼の編集ができないので、お手数おかけいたしました。 >※もし引数があまりに多いようでしたら、個人的にはclassにする方をおすすめしますが・・・ こちらも参考にさせていただきます。 このたびはありがとうございました。

その他の回答 (4)

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.4

私なら関数の入り口を1つにすることに拘らないです。 後ろの省略はともかくとし、複雑に渡す引数を変えるのであれば、引数に合わせて関数名を変えます。 そこからデフォルト値を持たせて、本来の関数を呼び出せばいいでしょう。

ixkaito
質問者

お礼

ご回答ありがとうございます。

ixkaito
質問者

補足

確かにその方がシンプルでいいのですが、今回の場合引数の数が多いので、その分関数を作ると実行側でのメリットがあまりないかなと思いまして… どちらかというと、複数のページで関数を実行しますが、基本的には引数設定なしで、デフォルト値で関数を使いますが、必要なときだけ、特定の引数を渡す、というような使い方を想定しております。

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.3

$param = array('ccc'=>'ししし','aaa'=>'えええ'); var_dump( setParam($param) ); function setParam($param){ //初期値 $def = array('aaa'=>'AAA','bbb'=>'BBB','ccc'=>'CCC'); //初期値と引数マージ $set = array_merge($def,$param); return $set; } 連想配列とあるので多分、こういうこと?

ixkaito
質問者

お礼

ご回答ありがとうございます。 引数の数が多いので、関数実行時に必要なもののみを設定し、あとは予め設定したデフォルト値を出力、また引数の順番を一々覚える必要がないよう、連想配列で設定できればなと思っておりました。 まだ試しておりませんが、ぱっと見でやりたかったことに近いと思います。 早速試させていただきます。もし何かありましたら補足させていただきます。

ixkaito
質問者

補足

回答を参考に下記のようにしました。 function setParam($param){ //初期値 $def = array('aaa'=>'AAA','bbb'=>'BBB','ccc'=>'CCC'); //初期値と引数マージ $set = array_merge($def,$param); echo $set['aaa']; echo $set['bbb']; echo $set['ccc']; } 【実行側】 setParam(array( 'ccc' => 'ししし', 'aaa' => 'あああ' )); 上記で問題なく「あああBBBししし」が出力されましたが、初期値のみを出力する際に、setParam(array());としないと出力されず、これをsetParam();で初期値が出力されるようにするにはどのようにすればいいでしょうか? お手数おかけいたしますが、よろしくお願い致します。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

一つ飛ばして引数をわたしたいとかそういうことなんだとは想像しますが すなおにnullを渡してやれば済むのでは? いらない右側は完全に省略できます。 <?PHP function test($a=null,$b=null,$c=null,$d=null){ if(!is_null($a)) print "a=".$a."<br>\n"; if(!is_null($b)) print "b=".$b."<br>\n"; if(!is_null($c)) print "c=".$c."<br>\n"; if(!is_null($d)) print "d=".$d."<br>\n"; } test(1,null,2); print "<hr>"; test(null,3); print "<hr>"; test(,4);//のような省略のしかたはできない

ixkaito
質問者

お礼

ご回答ありがとうございます。

ixkaito
質問者

補足

>一つ飛ばして引数をわたしたいとかそういうことなんだとは想像しますが その通りです! >すなおにnullを渡してやれば済むのでは? 関数実行時に値を設定しない引数は予め設定したデフォルト値を出力させたいのですが、こちらのやり方でもいけますか? また、引数の数が多く、関数実行時に順番を一々覚える必要がないよう、連想配列で設定できればと思っております。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

配列で渡すのであれば、受け取った側(関数側)で所定のキーの存在をチェック(なかったら初期値をセット)すればいいのでは? function test_func($arg_arr) { if (!array_key_exists('aaa', $arg_arr)) { $arg_arr['aaa'] = ''; } if (!array_key_exists('bbb', $arg_arr)) { $arg_arr['bbb'] = ''; }    :    : }

ixkaito
質問者

お礼

早速ご回答いただきましてありがとうございます。 試させていただきます!

ixkaito
質問者

補足

試させていただきましたところ、問題なく動作しましたが、No.3さんのやり方の方が、初期値の設定がシンプルだったので、そちらをベストアンサーとさせていただきます。 このたびは、勉強になりました。 ありがとうございました。

関連するQ&A