以下のように、関数を呼び出すときに引数の個数を可変にするスマートなやり方は、何かあるでしょうか?
$arrは配列
func1($arr) {
// $arrの個数が3個のとき
func2($arr[0], $arr[1], $arr[2]);
// $arrの個数が5個のとき
func2($arr[0], $arr[1], $arr[2], $arr[3], $arr[4]);
}
例えば、
$args = '$arr[0], $arr[1], $arr[2]'
としたとき、
func2($args)
とすると、func2には文字列として渡りますが、これを上のように
func2($arr[0], $arr[1], $arr[2])
として呼びたいです。
こんな方法何かあるでしょうか?
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
疑問の多い質問だがそれは置いといて、希望してるであろうことを素直に考えてみた。
といってもそれ自体理解してるかどうかも怪しいのだが。呼出し部分のコードを文字列として生成。それをevalで実行というのが考えられる。次のがそのサンプル。
# ここから
<?php
function func2($arg1, $arg2, $arg3)
{
echo "\$arg1:$arg1, \$arg2:$arg2, arg3:\$$arg3\n";
}
$arr = array('りんご', 'バナナ', 'メロン');
$args = '';
for ($i = 0; $i < count($arr); $i++){
$args .= "\$arr[$i],";
}
$code_str = 'func2(' .rtrim($args, ',') .');';
var_dump($code_str); # debug こういう文字列を作って
eval($code_str); # evalで実行させる
?>
# ここまで
当然だがこういう呼びかたでfunc2がうまく動くというのが前提。実際にどうなるかはfunc2の中身がわからないので保証できない。
func2側で対応するという話なら既に回答があるとおり可変長の引数や引数のデフォルト値を決める方法で対応すればいいと思います。
お忙しい中、ご回答どうもありがとうございます。
教えていただいた方法で解決することができました!!
今回のfunc2()は既に可変長引数を受け取るようになっているのですが、第1引数をSQL文、第2引数以降をSQL文に渡すパラメータとして受け取る仕様の関数だったので、どうしても呼び出し側でパラメータをばらして渡す必要がありました。
このテクニックは、今後も役立ちそうです。
本当にどうもありがとうございました。
No.3
- 回答日時:
#1ですが、意味わかんなくなってきました。
> func2()を呼び出す部分の引数を可変にしたいのです。
つまりfunc2()の仮引数が可変であれば良い、という事とは別なのでしょうか?
func2()が可変引数に対応した記述で定義されていない限り、可変引数を
利用した呼び出しは不可能だと思いますよ。
もしくは渡したい値がfunc1()実引数の配列の中身と決まっているのなら、
#2さんの仰るとおり、配列をそのまま渡すべきです。
func2()の仮引数に明示的に意味合いが存在し、かつそれを別々の仮引数として
定義したい場合に限り、func2()を先に述べたような方法で可変引数として
対応可能な定義にした方が良いかと思います。
(もしくは渡される実引数の数にMAX値が存在するならば、#2で紹介のある通り、
デフォルト値を有する仮引数の定義方法)
いずれにしても、func2()はもう出来上がっているからいじりたくない、
func2()を呼び出す所だけを可変にしたいという考え方では不可能だと思います。
何せfunc2()がその呼び出し方法に対応した定義と処理ではないのですから。
func2()の中身は絶対にいじりたくないんだ!という事であれば、func2()を
呼び出す前にfunc2()の呼び出し方に変換してくれるような関数を
ワンクッション噛ませないといけませんね。
No.2
- 回答日時:
func2にも$arr(配列)のまま渡して、func2の受け側で配列要素数を判定して処理するほうが素直ですが、
func2($arr[0], $arr[1], $arr[2])として引数の数を可変にしたいのなら
function func2($a1,$a2=null,$a3=null,$a4=null,$a5=null,$a6=null){
のようにfunc2を定義すればよいです。
お忙しい中、ご回答ありがとうございました。
今回func2()は、既に可変長引数を受け取ることができるようになっているのですが、#4の理由で、呼び出し側で引数をばらす必要がありました。
ありがとうございました。
No.1
- 回答日時:
PHPって確か引数の指定が強制されないんですよね。
なので
function func2() {
switch (func_num_args()) {
case 1:
echo func_get_arg(0);
break;
case 2:
echo func_get_arg(0);
echo func_get_arg(1);
break;
case 3:
echo func_get_arg(0);
echo func_get_arg(1);
echo func_get_arg(2);
break;
}
func2($arr[0], $arr[1], $arr[2]);
みたく出来ちゃいます。
http://jp2.php.net/manual/ja/function.func-get-a …
左のリストに似たような関数名のものが全てそれを実現するのに
利用されるであろう関数群になります。
ただこれをすると、PDTなどの統合開発環境を利用している環境で、
当該関数を呼び出そうとして出てくるはずの引数のリストが
出てきません。
(関数定義で引数がないので当然ですが)
PHPは他の言語と同等のオーバーロードがサポートされていませんので、上記方法か
__call()を利用する方法くらいで対応するしかありませんね。
http://jp2.php.net/manual/ja/language.oop5.overl …
ご回答どうもありがとうございます。
すいません、私の質問の仕方が良くなかったようなのですが、今回はfunc2()の中身ではなく、func2()を呼び出す部分の引数を可変にしたいのです。
つまり、func1()に渡ってきた配列の要素数によって、
func2($arr[0], $arr[1], ……, $arr[n-1]);
という形でfunc2()をコールしたいのです。
もし何か方法をご存知でしたら、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) excel vbaの配列なんですが・・・ 1 2022/12/26 18:50
- PHP c言語 文字 - '1'+26 3 2022/03/26 20:58
- C言語・C++・C# int temp = 0; if(isdigit(arr[i])){//文字が数字であれば(0~9) 1 2022/03/27 01:37
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- JavaScript 配列の1要素を代入した変数を使って元の配列要素を削除できるか 1 2023/07/28 03:34
- Visual Basic(VBA) vb.netです。2次元配列の要素をFor Eachでひとつづつ取得したい。 4 2022/07/05 11:30
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPの構文で間違えが分からない
-
三重県南部の温泉
-
ジャグ配列
-
関数の引数に配列を初期化なしで。
-
PHP、{}記号の意味
-
楽天トラベルで「京都の宿」が...
-
foreachとかの勝手な省略?
-
foreachで配列を、左から縦3列...
-
PHP: 未定義エラーの回避方法を...
-
PHPは何故値渡しより参照渡しの...
-
STLのvectorで作った配列をメン...
-
c言語 単位行列
-
【PHP】csvファイルへの書き出...
-
禁止ワード設定
-
aaa.csvとbbb.csvを条件で抽出...
-
○番目から○番目までの取り出し...
-
Zend_Form_Element_Hash
-
文字列連結パターンが多数ある場合
-
While文を使って配列の中身を全...
-
phpで検索結果をランダムに表示
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPでこのコード自体に意味は無...
-
マッチング処理(1:N)
-
foreachで上限回数指定方法また...
-
PHP、{}記号の意味
-
PHPで変数名にハイフンを使うに...
-
PHPで連想配列のプルダウンメニ...
-
VB.NET で 二次元のハッシュは...
-
多次元配列を、1次元の配列にす...
-
配列からプルダウン用のHTMLを生成
-
Smartyでインクリメント
-
phpでforeachの中にforeachがあ...
-
foreachとかの勝手な省略?
-
Excel VBAでフィルター後の対象...
-
foreachで配列を、左から縦3列...
-
$_POST受信で必要項目のみを結...
-
リストボックス複数選択抽出方法
-
POSTで渡されるデータの数がわ...
-
ftokが動かない?
-
foreachの間にテーブルの<TR>を...
-
3つの連想配列を交互に代入し...
おすすめ情報