使用变量名称数组来调用函数

时间:2016-08-25 10:06:42

标签: php arrays

我想使用数组来调用函数。

首先,我通过邮寄获得表格,所以我有类似的东西。

$var1="red";
$var2="blue";
$var3="Mary";
$varN="Ted";

我创建了一个这样的数组:

$variables=array("$var1", "$var2", "$var3", "$varN");

我想用这个数组来调用另一个函数,实际上它是一个MySQL查询。所以我想使用数组得到这个结果:

addToTable($var1, $var2, $var3, varN);

它可以吗?

我这样做的原因是因为我将在表中引入多个条目,它是一个可变数量的条目,并且数组var名称将会改变。对于下一轮,我将在查询中引入类似于此的内容:

addToTable($var1_2, $var2_2, $var3_2, varN_2);

3 个答案:

答案 0 :(得分:1)

您可以将其作为数组传递给函数,并在函数内部执行$variables = array($var1, $var2, $var3, $varN);

您的变量:

function addToTable($array = [])
{
   foreach ($array as $key => $value) {
      // Do stuff here
   }
}

功能:

addToTable($variables);

你可以这样调用这个函数:

^\s*
subblock
[\s\S]+?
^\s*\};$

答案 1 :(得分:1)

您可以使用call_user_func_array()将参数数组传递给函数。

function addToTable($a, $b, $c, $d)
{
    return "{$a}-{$b}-{$c}-{$d}";
}

$var1 = 'red';
$var2 = 'blue';
$var3 = 'Mary';
$varN = 'Ted';

$arguments = array($var1, $var2, $var3, $varN);
$x = call_user_func_array('addToTable', $arguments);

echo $x; // red-blue-Mary-Ted

答案 2 :(得分:0)

除了上面已经提到的call_user_func_array()之外,从5.6开始,您还可以通过以下方式执行类似的操作:

Variadic Functions

您可以在其中将任意数量的值传递给函数,该函数将它们收集到可迭代的参数中:

function foo(...$arguments)
{
    foreach ($arguments as $arg) {
        echo $arg . PHP_EOL;
    }
}

foo(1, 2, 3);

收率:

1
2
3

这与传入数组或call_user_func_array()类似 - 虽然更灵活 - 例如,您可以使用typehinting:

function foo(array ...$arguments)
{
    //
}

foo([], [], []); // works, each argument is an array
foo(1, 2, 3);    // fatal error!

参数解包

正如release docs Argument Unpacking中所述,执行以下操作:

  

使用...运算符调用函数时,可以将数组和可遍历对象解压缩到参数列表中。这也称为其他语言的splat运算符,包括Ruby。

如果您已经有一个值数组要应用于具有显式参数列表的函数,那么这非常有用。这可能是最好的方法,因为它是明确的,因此最容易推理。

function bar($a, $b, $c)
{
    echo $a . PHP_EOL;
    echo $b . PHP_EOL;
    echo $c . PHP_EOL;
}

$params = [1, 2, 3];
bar(...$params);

收率:

1
2
3

否则,如果您使用< = 5.5,则可以使用func_get_args()近似可变方法:

function baz()
{
    foreach (func_get_args() as $arg) {
        echo $arg . PHP_EOL;
    }
}

baz(1, 2, 3, 4);

PHP函数不需要函数具有显式参数列表。但是,我认为更难以推断出一个没有明确说明其参数的函数,而且验证和使用传递给它的参数更难。

希望这会有所帮助:)