在不使用数组的情况下将无限数量的参数传递给函数

时间:2013-06-01 07:13:12

标签: php function variables

我有情况我想在php函数中传递变量。 参数的数量是无限的。我必须在不使用数组的情况下传递函数。 就像正常方法一样。逗号分开。

test(argum1,argum2,argum3.....,..,,.,.,.....);  我怎么称呼这个功能?假设我有一个包含5个参数的数组数组(1,2,3,4,5)。我想调用像func(1,2,3,4,5)这样的函数。但问题是,在调用函数时,我将如何运行参数循环。我试过func(implode(',',array));但它将所有返回字符串作为一个参数

  • 在定义中,我也想要相同的格式。

  • 我可以通过数组传递可变数量的参数,但我必须以逗号分隔。

  • 我必须将逗号分开。但是在传递时我不知道参数的数量,它们在数组中。

6 个答案:

答案 0 :(得分:4)

在主叫方,使用call_user_func_array 在函数内部,使用func_get_args

由于这种方式你只是将一个数组转换为一个数组的参数,我怀疑它的智慧。如果您在调用 接收时参数 ,则任一功能都可以。如果两端都是动态的,为什么不直接传递数组?!

答案 1 :(得分:2)

您可以将您的功能定义为

function test ()

然后在php中使用func_get_args函数。

然后您可以将参数作为数组处理。

实施例

function reverseConcat(){
      return implode (" ", array_reverse(func_get_args()));
}

echo reverseConcat("World", "Hello"); // echos Hello World

如果你真的想要处理它们,就像它们在命名参数中那样你可以做这样的事情。

function getDistance(){
     $params = array("x1", "y1", "x2", "y2");
     $args = func_get_args();
     // trim excess params
     if (count($args) >  count($params) {
         $args = array_slice(0, count($params));
     } elseif (count($args) < count($params)){
         // define missing parameters as empty string
         $args = array_pad($args, count($params), "");
     } 
     extract (array_combine($params, $args));
     return sqrt(pow(abs($x1-$x2),2) + pow(abs($y1-$y2),2));

}

答案 2 :(得分:2)

你可以使用:

$function_args = func_get_args();

在test()函数定义中。

答案 3 :(得分:0)

使用此功能:

  function test() {
      $args = func_get_args();
      foreach ($args as $arg) {
        echo "Arg: $arg\n";
      }
    }

答案 4 :(得分:0)

我不确定你用“相同的格式”是什么意思。你的意思是同一种类型,就像它们都必须是一个字符串一样?或者你的意思是他们需要满足一些标准,例如,如果它是一个电话号码列表,他们需要(ddd) ddd-dddd

如果是后者,那么预先定义的参数就会遇到麻烦,所以我假设你的意思是希望它们都是同一类型。

因此,基于已经建议的使用func_get_args()的解决方案,我还会应用array_filter()来确保类型:

function set_names() {

    function string_only($arg) {

        return(is_string($arg));

    }

    $names_provided = func_get_args();  
    // Now you have an array of the args provided

    $names_provided_clean = array_filter($names_provided, "string_only"); 
    // This pulls out any non-string args

    $names = array_values($names_provided_clean); 
    // Because array_filter doesn't reindex, this will reset numbering for array.

     foreach($names as $name) {
           echo $name;
           echo PHP_EOL;
      }
}

set_names("Joe", "Bill", 45, array(1,2,3), "Jane");

请注意,我没有进行任何更深入的健全性检查,因此如果没有传入任何值,可能会出现问题等。

答案 5 :(得分:-2)

您也可以使用explode http://www.php.net/manual/en/function.explode.php来使用数组。

$separator = ",";
$prepareArray = explode ( $separator , '$argum1,$argum2,$argum3');

但请注意, $ argum1,$ argum2,等不应包含值。您可以通过添加任何分隔符来克服此问题 $ separator =“VeryUniqueSeparator”; 我没有代码所以不能确切的代码。但是操纵它可以满足您的要求。