【问题标题】:PHP - Pass array as variable-length argument listPHP - 将数组作为可变长度参数列表传递
【发布时间】:2012-02-21 03:42:54
【问题描述】:

我的 PHP 脚本中有一个非常简单的问题。定义了一个函数,它采用可变长度参数列表

function foo() {
  // func_get_args() and similar stuff here
}

当我这样称呼它时,它工作得很好:

foo("hello", "world");

但是,我在数组中有我的变量,我需要将它们“单独”作为单个参数传递给函数。例如:

$my_args = array("hello", "world");
foo(do_some_stuff($my_args));

是否有任何 do_some_stuff 函数可以为我拆分参数以便我可以将它们传递给函数?

【问题讨论】:

标签: php arrays function variadic-functions


【解决方案1】:

【讨论】:

  • +1 表示Reflections。虽然在这里有点矫枉过正,但对付他们总是很酷!
【解决方案2】:

你需要call_user_func_array

call_user_func_array('foo', $my_args);

http://php.net/manual/en/function.call-user-func-array.php

【讨论】:

  • 感谢您的回答,这正是我所需要的。但是,我只能接受一个答案。
【解决方案3】:

您正在搜索call_user_func_array()

http://it2.php.net/manual/en/function.call-user-func-array.php

用法:

$my_args = array("hello", "world");
call_user_func_array('foo', $my_args);

// Equivalent to:
foo("hello", "world");

【讨论】:

  • 在我看来这比使用反射要好得多
【解决方案4】:

听起来你在找call_user_func_array

【讨论】:

  • 感谢您的回答,这正是我所需要的。但是,我只能接受一个答案。
  • 只接受提供最需要详细信息的那个,或者最早的一个:)
【解决方案5】:

【讨论】:

  • 不。我已经读过这个。所有的功能都应该在我的“foo”功能内部工作。我需要在将参数传递给函数之前对其进行拆分。
【解决方案6】:

如果您可以更改foo() 的代码,应该很容易在一个地方解决这个问题。

function foo()
{
    $args = func_get_args();
    if(count($args) == 1 && is_array($args[0]))
    {
        $args = $args[0]
    }
    // use $args as normal
}

【讨论】:

  • 如果他想传递一个数组(真实的)作为第一个参数,这不起作用。
  • 不,如果只有一个参数并且该参数应该是一个数组,则它不起作用。如果有不止一个论点,那么他们都将被单独留下。
【解决方案7】:

完全不推荐这种解决方案,只是展示了一种可能性:

使用eval

eval ( "foo('" . implode("', '", $args_array) . "' )" );

【讨论】:

  • 我知道这只是“显示一种可能性”,但仍然......它是评估。 ;)
【解决方案8】:

我知道这是一个老问题,但它仍然作为第一个搜索结果出现 - 所以这里有一个更简单的方法;

<?php
function add(... $numbers) {
    $result=0;
    foreach($numbers as $number){
      $result+=intval($number);
    }
    return $result;
}

echo add(...[1, 2])."\n";

$a = [1, 2];
echo add(...$a);
?>

来源: https://www.php.net/manual/en/functions.arguments.php#example-142

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2012-08-26
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多