【问题标题】:Call function with (unknown) variable number of parameters?使用(未知)可变数量的参数调用函数?
【发布时间】:2012-04-12 17:13:48
【问题描述】:

我需要向函数发送参数

array_intersect_key()

但有时我需要发送 2 个数组,有时 - 3 个或更多:

array_intersect_key($arr_1, $arr_2);
OR
array_intersect_key($arr_1, $arr_2, $arr_3, $arr_4);

【问题讨论】:

  • 如果我理解你的问题,你已经回答了。

标签: php function variadic


【解决方案1】:

假设你想像这样创建自己的函数,关键是使用func_get_args()

function mumble(){
    $args = func_get_args();
    foreach ($args as $arg){
        ... whatever
    }
}

如果你只是想用多个参数调用它,要么“就这么做”,要么使用call_user_func_array()

$args = array();
... append args to $args
call_user_func_array('array_intersect_key', $args);

【讨论】:

  • 我以前从未遇到过这个功能,我觉得我应该很久以前就有了——非常感谢你引起我的注意!
【解决方案2】:
call_user_func_array('foo', array('foo', 'bar', 'foo N'));

function foo($param1, $param2, $paramN) {
    // TADÁÁÁ
}

【讨论】:

    【解决方案3】:

    查看func_get_args() method 以处理此问题;类似:

    function my_function() {
        $numArgs=func_num_args();
        if($numArgs>0) {
            $argList=func_get_args();
            for($i=0;$i<$numArgs;$i++) {
                // Do stuff with the argument here
                $currentArg=$argList[$i];
            }
        }
    }
    

    【讨论】:

      【解决方案4】:
      function foo()
      {
          $numargs = func_num_args();
          echo "Number of arguments: $numargs<br />";
          $arg_list = func_get_args();
          foreach($arg_list  as $arg) {
              if(is_array($arg)) print_r($arg)."<br />";  
              else echo "<br />".$arg;
          }
      }
      
      foo(array(1,2,3), 2, 3);
      

      【讨论】:

        【解决方案5】:

        在询问标准功能之前,请先参考http://php.net 网站,因为您自己的所有问题都会在那里得到解答。

        http://php.net/manual/en/function.array-intersect-key.php

        http://php.net/manual/en/function.func-get-args.php

        http://php.net/manual/en/ref.funchand.php

        我有你的问题,这是你可以做到的一种方法:

        $arr_of_arr = array($arr1, $arr2, $arr3, ..., $arrn);
        

        $arr_of_arr = func_get_args();
        
        if(count($arr_of_arr) > 1){
            for($i = 0; $i < count($arr_of_arr) - 1; $i++){
                if(! $i){
                    $intersec = array_intersect_key($arr_of_arr[0], $arr_of_arr[1]);
                    $i = 2;
                }
                else{
                    $intersec = array_intersect_key($intersec, $arr_of_arr[$i++]);
                }
            }
        }
        

        $intersec 现在将包含交集。

        【讨论】:

        • 请扩展链接以及它们与问题的关系。一个小例子对提高响应质量大有帮助。
        • @pst 很抱歉这个答案。现已添加代码。
        【解决方案6】:

        array_intersect_key已经有一个允许多个输入的原型:

        array array_intersect_key ( array $array1 , array $array2 [, array $ ... ] )
        

        所以我并没有真正看到那里的问题。

        【讨论】:

        • 问题是“如何用 N 个输入调用它”?
        • array_intersect_key ( $array1 , $array2, $array3, ...,$arrayN);
        • 这个答案不涉及这样一个事实,即 OP 将没有先验知识(以编程方式)将多少个参数传递给 array_intersect_key()。你没有看到这个问题,因为你误解了这个问题是关于编写可变参数函数的。投反对票,因为这个答案没有帮助。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-11
        • 1970-01-01
        • 1970-01-01
        • 2022-08-09
        • 2020-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多