電子書籍の厳選無料作品が豊富!

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

ご教授のほどよろしくお願いいたします。

A 回答 (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にする方をおすすめしますが・・・
    • good
    • 0
この回答へのお礼

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

なるほどこういうやり方もあるんですね。

実は先ほどの補足後に自己解決しまして、下記のようにしたところ、

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にする方をおすすめしますが・・・

こちらも参考にさせていただきます。


このたびはありがとうございました。

お礼日時:2013/02/21 17:36

私なら関数の入り口を1つにすることに拘らないです。


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

この回答への補足

確かにその方がシンプルでいいのですが、今回の場合引数の数が多いので、その分関数を作ると実行側でのメリットがあまりないかなと思いまして…

どちらかというと、複数のページで関数を実行しますが、基本的には引数設定なしで、デフォルト値で関数を使いますが、必要なときだけ、特定の引数を渡す、というような使い方を想定しております。

補足日時:2013/02/21 13:35
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/21 13:35

$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;
}

連想配列とあるので多分、こういうこと?

この回答への補足

回答を参考に下記のようにしました。

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();で初期値が出力されるようにするにはどのようにすればいいでしょうか?

お手数おかけいたしますが、よろしくお願い致します。

補足日時:2013/02/21 14:41
    • good
    • 0
この回答へのお礼

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

引数の数が多いので、関数実行時に必要なもののみを設定し、あとは予め設定したデフォルト値を出力、また引数の順番を一々覚える必要がないよう、連想配列で設定できればなと思っておりました。

まだ試しておりませんが、ぱっと見でやりたかったことに近いと思います。

早速試させていただきます。もし何かありましたら補足させていただきます。

お礼日時:2013/02/21 13:14

一つ飛ばして引数をわたしたいとかそういうことなんだとは想像しますが


すなおに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);//のような省略のしかたはできない

この回答への補足

>一つ飛ばして引数をわたしたいとかそういうことなんだとは想像しますが

その通りです!


>すなおにnullを渡してやれば済むのでは?

関数実行時に値を設定しない引数は予め設定したデフォルト値を出力させたいのですが、こちらのやり方でもいけますか?

また、引数の数が多く、関数実行時に順番を一々覚える必要がないよう、連想配列で設定できればと思っております。

補足日時:2013/02/21 13:04
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/21 13:03

配列で渡すのであれば、受け取った側(関数側)で所定のキーの存在をチェック(なかったら初期値をセット)すればいいのでは?



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'] = ''; }
   :
   :
}

この回答への補足

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

このたびは、勉強になりました。
ありがとうございました。

補足日時:2013/02/21 17:45
    • good
    • 0
この回答へのお礼

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

試させていただきます!

お礼日時:2013/02/21 12:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!