2

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

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

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

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

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

4

6 回答 6

4

在调用方,使用call_user_func_array.
在函数内部,使用func_get_args.

由于这种方式您只是将数组转换为数组的参数,因此我怀疑这样做是否明智。如果您在调用接收时有未知数量的参数,则任一函数都可以。如果两端都是动态的,为什么不直接传递数组呢?!

于 2013-06-01T07:40:22.540 回答
2

您可以使用 :

$function_args = func_get_args();

在您的 test() 函数定义中。

于 2013-06-01T07:17:33.787 回答
2

您可以将您的功能定义为

function test ()

然后使用func_get_argsphp中的函数。

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

例子

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));

}
于 2013-06-01T07:16:13.657 回答
0

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

如果是后者,那么您在使用预定义参数时也会遇到同样的麻烦,所以我假设您的意思是您希望它们都是相同的类型。

因此,脱离已经建议的 using 解决方案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");

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

于 2013-06-01T08:00:33.643 回答
0

使用这个功能:

  function test() {
      $args = func_get_args();
      foreach ($args as $arg) {
        echo "Arg: $arg\n";
      }
    }
于 2013-06-01T07:18:34.790 回答
-2

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

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

但要小心,$argum1,$argum2等不应包含 , 的值。您可以通过添加任何分隔符来克服这个问题。$separator = "非常独特的分隔符"; 我没有代码,所以无法说出确切的代码。但是操纵它将根据您的要求工作。

于 2013-06-01T07:30:40.370 回答