![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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にする方をおすすめしますが・・・
再度ご回答ありがとうございます。
なるほどこういうやり方もあるんですね。
実は先ほどの補足後に自己解決しまして、下記のようにしたところ、
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にする方をおすすめしますが・・・
こちらも参考にさせていただきます。
このたびはありがとうございました。
No.4
- 回答日時:
私なら関数の入り口を1つにすることに拘らないです。
後ろの省略はともかくとし、複雑に渡す引数を変えるのであれば、引数に合わせて関数名を変えます。
そこからデフォルト値を持たせて、本来の関数を呼び出せばいいでしょう。
この回答への補足
確かにその方がシンプルでいいのですが、今回の場合引数の数が多いので、その分関数を作ると実行側でのメリットがあまりないかなと思いまして…
どちらかというと、複数のページで関数を実行しますが、基本的には引数設定なしで、デフォルト値で関数を使いますが、必要なときだけ、特定の引数を渡す、というような使い方を想定しております。
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;
}
連想配列とあるので多分、こういうこと?
この回答への補足
回答を参考に下記のようにしました。
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();で初期値が出力されるようにするにはどのようにすればいいでしょうか?
お手数おかけいたしますが、よろしくお願い致します。
ご回答ありがとうございます。
引数の数が多いので、関数実行時に必要なもののみを設定し、あとは予め設定したデフォルト値を出力、また引数の順番を一々覚える必要がないよう、連想配列で設定できればなと思っておりました。
まだ試しておりませんが、ぱっと見でやりたかったことに近いと思います。
早速試させていただきます。もし何かありましたら補足させていただきます。
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);//のような省略のしかたはできない
この回答への補足
>一つ飛ばして引数をわたしたいとかそういうことなんだとは想像しますが
その通りです!
>すなおにnullを渡してやれば済むのでは?
関数実行時に値を設定しない引数は予め設定したデフォルト値を出力させたいのですが、こちらのやり方でもいけますか?
また、引数の数が多く、関数実行時に順番を一々覚える必要がないよう、連想配列で設定できればと思っております。
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'] = ''; }
:
:
}
この回答への補足
試させていただきましたところ、問題なく動作しましたが、No.3さんのやり方の方が、初期値の設定がシンプルだったので、そちらをベストアンサーとさせていただきます。
このたびは、勉強になりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- 英語 関係副詞の先行詞の省略について質問です 調べたところ、省略可能な先行詞は whereは「the pl 1 2022/12/07 22:00
- 英語 関係副詞の 先行詞の 省略について質問です 調べたところ、省略可能な先行詞は whereに対して「t 1 2022/12/08 19:31
- Excel(エクセル) エクセルでエラーを無視して一番左側のセルの値を返したい 2 2023/07/27 13:06
- Excel(エクセル) エクセル・セルに数式を入力してセル指定計算 2 2023/04/21 12:46
- 英語 関係副詞または先行詞の省略、について ①限定的用法では関係副詞は常に省略できる。ただし、非限定的用法 1 2022/12/09 19:55
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マッチング処理(1:N)
-
配列から順位を算出したい
-
PHPで連想配列のプルダウンメニ...
-
Excel VBAでフィルター後の対象...
-
PHPからCSVをアップロード後、m...
-
配列を回すとき、最後の要素だ...
-
配列の添え字が小数だとどうなる?
-
CSVデータの行数カウントをした...
-
別ファイルの構造体の値を読み...
-
配列の初期化
-
順位を付ける時のスコアの重複...
-
file_existsでファイル名の部分...
-
CSVファイルの最終行のデー...
-
foreachのなかで次のキーを参照...
-
チェックボックス複数選択 mys...
-
漢字のソートについて
-
配列の要素(value)に、変数を...
-
String だと「 ByRef引数の型が...
-
verilogで、配列の一部をタスク...
-
phpで、連想配列を普通の配列に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
重複確認
-
foreachで上限回数指定方法また...
-
マッチング処理(1:N)
-
Excel VBAでフィルター後の対象...
-
VB.NET で 二次元のハッシュは...
-
多次元配列を、1次元の配列にす...
-
SELECT 使用時の bindValue の...
-
Smartyでインクリメント
-
PHPでこのコード自体に意味は無...
-
PHP、{}記号の意味
-
配列を比較して同じものがあっ...
-
phpでforeachの中にforeachがあ...
-
多次元配列の中で条件に合う要...
-
sqlのデーターを『あ行』『か行...
-
ラジオボタンをランダムに表示...
-
キーが倍数の時の値の存在チェ...
-
三重県南部の温泉
-
foreachで配列を、左から縦3列...
-
ジャグ配列
-
構造体の中でユーザー定義型の...
おすすめ情報