• ベストアンサー

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

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

  • PHP
  • 回答数5
  • ありがとう数5

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

  • ベストアンサー
  • 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

  • ユーザ関数で引数省略は可能ですか?

    Javascriptの関数でデフォルト値は設定できますか? 下記の書き方ですと関数の呼出し側で、引数を省略した際 エラーになってしまいます。 test1(1,2); test1(1,2,3); test1(1,2,3,4); function test1(a,b,c=1,d=1) { alert (c); alert (d); }

  • 【PHP】usort()関数内の引数について

    【PHP】usort()関数内に出てくる関数の引数の意味を教えてください。 usort(ユーザー定義関数) 以下のような配列があります。ここで'score'を小さな順番(昇順)で並べ替えるためにusort()関数を使いたいと思います。 $data= [ ['name' => 'yamada', 'score'=> 80], ['name' => 'suzuki', 'score'=> 60], ['name' => 'tanaka', 'score'=> 70], ['name' => 'okada', 'score'=> 60], ]; usort( $data, function($a, $b){ if ($a['score']=== $b['score']){ return 0; } return $a['score'] > $b['score'] ? 1: -1; } ); echo "<pre>"; print_r($data); echo "</pre>"; ----------------------------------------------------------------- サンプルでは上記のように$a,$bが使用されています。 スコアの数値を比較して、あるスコアの値と別のスコアの値が同じであれば「0」を返す。$aの値が$bより大きければ「1」を返す、そうでなければ「-1」を返す。 返ってきた値、「-1」,「 0」,「 1」と小さな順に並べる… こういうことかと思います。添付画像のように表示された値も合っています。 が、functionの引数($a, $b)の意味がよくわかりません。 foreachなどでループさせ値を一つづつ比較するというよう作業を行うのであればまだ理解できるかもしれませんが、ただ単に引数に function($a, $b)…としただけでscoreの値が$a、$bにどうやって代入されていくのでしょうか?? $a, $bと記述しただけで全てのscoreの値をなぜ比較してくれるのかわかりません。 また、現在$dataの中には4つしか配列がありません。-1,0,1だけで順番をつけられるでしょうが、これが50, 100個と配列データが増えた場合でもこのやり方でできるのでしょうか? 初学者です。分かる方いらっしゃいましたら教えて下さい。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 関数の引数に配列を初期化なしで。

    関数の引数に配列を初期化して渡しているプログラムを目にします。 関数の引数に配列を初期化なしで渡す場合とどう違うのでしょうか? 例 <?php echo tesutoFunc(array('reservation' => 'a','user' => 'b')); function tesutoFunc($arrays=array()){ //ここをなぜtesutoFunc($arrays)と書かないのか? print_r($arrays); } ?>

    • ベストアンサー
    • PHP
  • .NET - 配列変数を省略可能の引数にする方法

    お世話になっています。 .NETでのコーディングを行っています。 標記の件ですが、初めてなので .NETからなのか、もともとそうなのかは不明なのですが、 プロシージャの引数をOptionalで宣言すると、 省略された時の値を設定する必要がありますよね。 省略可能の引数を配列変数にしたい場合、どのように宣言したら良いのでしょうか? 初期値って言っても、今回省略可能にしたい変数は、 検索結果を格納するための変数ですので、 省略されたときには何の値も入っていなくて良いんです。 宣言部分は以下のとおりです。 Public Function CM_fun_b_Get_WeekdayNm(ByRef Wstr_WeekKb() As String, _ ByRef Wstr_WeekNm() As String, _ ByRef Wstr_WeekNmR() As String) As Boolean この、Wstr_WeekNmR()を省略可能にしたいのです。 このような場合、どうやって宣言するべきなのでしょうか? ヘルプを見たのですが、よくわからなくて・・・(;_;) 念のため、省略された時に、何らかの値を設定する方法も知りたいです。 よろしくお願いいたします。

  • 関数の第二引数を省略可にする方法

    PHPのソースで <?php // -------------- function hogehoge($str,$strstr) { $s = $str; $s .= ' - '. $strstr; return $s; } echo hogehoge('Hello world','ようこそ!'); // -------------- ?> とすると Hello world - ようこそ! とでますが、 hogehogeの第二引数を省略して <?php // -------------- echo hogehoge('Hello world'); // -------------- ?> hogehogeの第二引数を省略するとエラーが出るので <?php // -------------- function hogehoge($str,$strstr) { $s = $str; $result_strstr = $strstr; // if ( $result_strstr != '' ) ) { $s .= ' - '. $strstr; } if ( isset( $result_strstr ) ) { $s .= ' - '. $strstr; } return $s; } echo hogehoge('Hello world'); // -------------- ?> とやってもエラーが出て 第二引数を省略可という関数を作ることができません。 どのようにすればよいのでしょうか?

    • ベストアンサー
    • PHP
  • PHP間の引数

    おはようございます。 PHP間の引数に多次元配列を使用したいと考えています。 test1.phpで$array[a][b]を作成し test2.phpでそれを表示したいとかんがえています。 HTMLを使用していもかまいません。 宜しくお願いいたします。

    • 締切済み
    • PHP
  • phpで、連想配列を普通の配列に変換する関数

    タイトル通りなのですが、phpで、連想配列を普通の配列に変換する関数ってありますでしょうか? $a = array("one" => "Sunday", "two" => "Monday", "three" => "Tuesday"); $b = array(0 => "Sunday", 1 => "Monday", 2 => "Tuesday"); $a配列を、$bに変換したいのです。 http://php.benscom.com/manual/ja/ref.array.php この辺とかは見てみたのですが、無いように見えました(見過ごしているような気もするのですが)。 無論、そういう機能を持つ関数は簡単に作れますが、既にphp自身で実装されているなら、それを使いたいと思います。 ありましたら、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 配列の中身を全て順番に別の関数へ引数として渡すには

    配列の中身を全て順番に別の関数へ引数として渡すには、どうすればよいでしょうか? このままだと、'null' は Null またはオブジェクトではありません。 となります。 function piyo(hoge){ alert(hoge); } for (var i = 0; i < hogearray.length; i ++) { piyo(hogearray[i]);//ここを通ったら、順番の関数を呼び出すようにしたい } また、グローバル変数として渡すには、どうすればよいでしょうか?

  • PHPのusort関数について

    PHPにおけるusort関数およびuasort uksort関数の使い方がわかりません。 $array = array("b" => "bbbb","c" => "cc","d" => "ddddddddddd","e" => "eee","a" => "a","f" => "ffffffff","g" => "gg","h" => "hh"); 上記のような配列があった場合 uasort($array, function($a,$b){ if (strlen($a) == strlen($b)) { return 0; } if(strlen($a) > strlen($b)){ return -1; }else if(strlen($a) < strlen($b)){ return 1; } } ); print_r($array); 上記のようなコードの場合 ( [d] => ddddddddddd [f] => ffffffff [b] => bbbb [e] => eee [h] => hh [g] => gg [c] => cc [a] => a ) という結果がかえてきます。 ただ、実際このコードでなにがおきてるかわかりません。 まず、uasort関数の第二引数に渡す関数の引数 $a,$bはいったいどんな順番で第一引数の配列からわたされているのでしょうか? そして、$a と$ bの値が同じ場合に0を返した場合なにがおきてるのでしょうか? 同じく return 1;を返すときと return -1;を返すときと いったいどのような処理がおこなわれていてどういうなぜ 上記のような配列を返すことになるのでしょうか? そもそも PHPマニュアルから参照しますが 比較関数は、最初の引数と二番目の引数の比較結果を返します。最初の引数のほうが二番目の引数より大きい場合は正の数を、二番目の引数と等しい場合はゼロを、そして二番目の引数より小さい場合は負の数を返す必要があります。 上記説明も、どうにも理解できません。 どうも全体的にusort関数系の使い方がわかりません。 識者の方よろしくご教授いただけますようお願いします。

    • ベストアンサー
    • PHP
  • 自作関数の連想配列をreturnしたい。 

    環境:PHP5:WinXP(SP2) 自作関数を作成しているのですが、 不特定多数の添え字を持つ連想配列を全てreturnする 教えて頂けませんか?

    • ベストアンサー
    • PHP