【问题标题】:passing indefinite number of arguments to function without using an array在不使用数组的情况下将无限数量的参数传递给函数
【发布时间】:2013-06-01 07:13:11
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 是的,我已经完成了这个,但我的问题是如何传递变量?如果我不知道参数的数量,如果它们是不定数组。
  • 你可以简单地用逗号分隔传递。
  • 怎么样,我将通过逗号分隔。在运行时..

标签: php function variables


【解决方案1】:

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

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

【讨论】:

  • 哇 :) 谢谢。这就是我正在搜索的 call_user_func_array
  • 我正在创建一个 PHP 框架,为了方便用户,我将参数放在它自己的函数中:)
【解决方案2】:

你可以使用:

$function_args = func_get_args();

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

【讨论】:

    【解决方案3】:

    您可以将您的功能定义为

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

    【讨论】:

    • 感谢@Orangepill,但是,我将如何调用该函数?假设我有一个包含 5 个参数的数组 array(1,2,3,4,5)。我想调用像 func(1,2,3,4,5) 这样的函数。但问题是,当调用函数时,我将如何运行参数循环。我试过 func(implode(',',array));但它将所有返回字符串作为一个参数..
    • 你这样做的方式是使用call_user_func_array("reverseConcat", $array);
    【解决方案4】:

    使用此功能:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-13
          • 2020-09-10
          • 2014-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多