14

可変量のパラメーターを定義できる関数をPHPで定義する方法はありますか?

私がよく知っている言語では、次のようになります。

function myFunction(...rest){ /* rest == array of params */ return rest.length; }

myFunction("foo","bar"); // returns 2;

ありがとう!

4

6 に答える 6

36

はい。とを使用func_num_args()func_get_arg()て引数を取得します。

<?php
  function dynamic_args() {
      echo "Number of arguments: " . func_num_args() . "<br />";
      for($i = 0 ; $i < func_num_args(); $i++) {
          echo "Argument $i = " . func_get_arg($i) . "<br />";
      }
  }

  dynamic_args("a", "b", "c", "d", "e");
?>

PHP 5.6以降では、可変個引数関数を使用できるようになりました。

<?php
  function dynamic_args(...$args) {
      echo "Number of arguments: " . count($args) . "<br />";
      foreach ($args as $arg) {
          echo $arg . "<br />";
      }
  }

  dynamic_args("a", "b", "c", "d", "e");
?>
于 2010-01-22T14:43:41.850 に答える
6

宣言されたすべての引数を設定するのに十分な数がある限り、任意の関数に対して可変数の引数を受け入れることができます。

<?php

function test ($a, $b) { }

test(3); // error
test(4, 5); // ok
test(6,7,8,9) // ok

?>

に渡された追加の名前のない引数にアクセスするにtest()は、関数、、、および:を使用func_get_args()func_num_args()ますfunc_get_arg($i)

<?php

// Requires at least one param, $arg1
function test($arg1) {

  // func_get_args() returns all arguments passed, in order.
  $args = func_get_args();

  // func_num_args() returns the number of arguments
  assert(count($args) == func_num_args());

  // func_get_arg($n) returns the n'th argument, and the arguments returned by
  // these functions always include those named explicitly, $arg1 in this case
  assert(func_get_arg(0) == $arg1);

  echo func_num_args(), "\n";
  echo implode(" & ", $args), "\n";

}

test(1,2,3); // echo "1 & 2 & 3"

?>
于 2010-01-22T14:45:47.807 に答える
3

この質問は非常に古いものですが、実際にはPHP 5.6以降では、書いたものを正確に書くことができます:D

于 2015-03-12T22:14:01.330 に答える
2

あるいは単に

function printArgs() {

 foreach (func_get_args () as $arg){
  echo $arg;
 }
}

printArgs("1 ", "2 ", "three ");

出力1 2 three

于 2014-06-17T05:13:03.590 に答える
1

私は自分のPHPパラメーターでJavascript風のアプローチを取るのが好きです。これにより、「オプション」とそのデフォルト(これについては後で説明します)をより適切に設定できます。たとえば、配列内の時間の範囲を返す関数があるとします。パラメータ1は開始時刻、パラメータ2は終了時刻、パラメータ3は時間間隔であり、それ以降のオプションはオプションです( "format" => "24-hour"、 "include_seconds"=>TRUEなど。 )。

私はこのように関数を定義します:

function returnTimeInterval($startTime, $endTime, $interval, $options = array())
{
    // the first thing to do is merge options in with our defaults
    $options = array_merge(array(
        "format" => "24-hour",
        "include_seconds => TRUE
        // etc.
    ), $options);

これにより、関数内でデフォルトを設定してオーバーライドできるようになります。これは非常に便利です。もちろん、奇妙な未使用のオプションが渡されないように注意する必要がありますが、それはあなたに任せます。:)

于 2010-04-06T00:36:19.557 に答える
0

関数に配列を渡すことをお勧めします。そうすれば、その配列にできるだけ多くの異なるパラメーターを格納できます。必要な正しい情報を取得する関数に配列が含まれると、配列に対して実行できる操作は多数あります。

$array = array();
$array[0] = "a";
$array[1] = 1;

myFunction($array);
于 2010-01-22T14:45:41.523 に答える