在不使用数组的情况下向函数传递不确定数量的参数


passing indefinite number of arguments to function without using an array

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

test(argum1,argum2,argum3.....,..,,.,.,.....);

我将如何调用这个函数?假设我有一个包含5个参数的数组array(1,2,3,4,5)。我想把函数命名为func(1,2,3,4,5)但问题是,当调用函数时,我将如何运行参数循环。我尝试了func(implode(',',array));但是它将所有返回字符串作为一个参数

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

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

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

主叫端使用call_user_func_array
函数内部使用func_get_args

因为这样你只是把一个数组变成一个数组的参数,我怀疑这样做是否明智。当调用接收时,如果有未知数量的参数,这两个函数都可以。如果两端都是动态的,为什么不直接传递数组呢?

可以使用:

$function_args = func_get_args();

你可以把你的函数定义为

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

使用此函数:

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

我不知道你说的"相同的格式"是什么意思。你是说相同的类型,比如它们都必须是字符串吗?或者你的意思是他们都需要满足一些标准,比如如果这是一个电话号码列表,他们需要是(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");

请注意,我没有做任何更深层次的安全性检查,所以如果没有传入值,可能会出现问题,等等。

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

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

但要小心,$argum1,$argum2,等不应该包含,在值中。您可以通过添加任何分隔符来克服这个问题。$separator = " veryuniquesseparator ";我没有密码,所以不知道确切的密码。但是按照你的要求来操作它。