在PHP中使用单个函数修改多个变量

时间:2016-01-09 04:07:50

标签: php variables

我需要以相同的方式修改一些变量。例如,当满足某些条件时,我需要将每个变量乘以2。像这样:

$a = 10;
$b = 100;
$c = 1000;
$d = 10000;

if($someCondition) {
    $a *= 2;
    $b *= 2;
    $c *= 2;
    $d *= 2;
}

这里我想调用一个函数将更改应用于所有变量,而不是逐个相乘。我尝试使用像这样的 的回调函数(为这种类型的简单计算编写这样的函数可能看起来很傻,但我有更复杂的事情要做,只是为了更好地理解这里保持简单)

试验1

function multiply_vars(&$a,&$b,&$c,&$d) {
    foreach(func_get_args() as $val) {        
        $val *= 2;
    }
}

if($someCondition) {
    multiply_vars($a,$b,$c,$d);
}
  

这很有效,但我需要确切地知道我传递给函数的变量数量,并将每个变量设置为&的引用。例如,当我传递5个变量进行修改时,上面的函数会给我错误的结果。

试验2

function multiply_vars() {
    foreach(func_get_args() as $varname) {
        global $$varname;
        $$varname *= 2;
    }
}

if($someCondition) {
    modify_vars('a','b','c','d');
}
  

这适用于全球范围。但问题是,我在一个类函数中这样做,其中global $$varname引用了我的类函数之外的变量。

还有其他方法可以达到我的目的吗?

  

注意:我不想将变量放入数组中。我知道,array_map()函数可以更好地解决它,如果它在一个数组中。

5 个答案:

答案 0 :(得分:3)

您需要可变参数列表
这是通过引用将可变数量的参数传递给函数的示例:
PHP: variable-length argument list by reference?

从以上链接复制并粘贴:

示例1:

function foo(&...$args) {
    $args[0] = 'bar';
}
foo($a);
echo $a, "\n";
#  output:
#a

示例2:

function number(&...$args) {
    foreach ($args as $k => &$v) {
        $v = $k;
    }
}
number($zero, $one, $two);
echo "$zero, $one, $two\n";
#  output:
#0, 1, 2

答案 1 :(得分:1)

我意识到你说你不想把变量放在一个数组中。但是,您可能会传递一组引用以避免附加值复制。 E.g。

<?php
$a = 10;
$b = 100;
$c = 1000;
$d = 10000;

function multiply_vars($args) {
    foreach($args as &$arg) $arg *= 2;
}

multiply_vars([&$a, &$b, &$c, &$d]);

但是,如果您使用的是PHP 5.6,我认为Magical Gordon的更新答案是更好的解决方案。

答案 2 :(得分:0)

我只是将它们作为数组传递。例如:

$variables = array(
    'a' => 10,
    'b' => 100,
    'c' => 100,
    'd' => 1000,
);

function multiply_vars($variables) {
    $returnValues = array();
    foreach($variables as $key => $value) {        
        $newValue = $value * 2;
        array_push($returnValues, array($key => $newValue));
    }
    return $returnValues;
}

if($someCondition) {
    $variablesWithNewValues = multiply_vars($variables);
    //do stuff with  $variablesWithNewValues
}

答案 3 :(得分:0)

您的需求告诉您的策略不正确。即使它有效,您的代码可读性和可维护性也不会很好! 无论如何,我建议您创建一个函数而不是您的过程,您可以在需要时调用它并用输出替换原始变量。

一个例子:

Function doStuff ($input){
    treat_input;
    Return output;
 }

$x = doStuff ($×);
 ....

嗯,我知道您需要多次调用此函数作为变量的数量。但请相信我,这是你必须根据长期维护脚本的经验而去的方式。

答案 4 :(得分:0)

在这里扩展其他答案,为什么不使用一个对象?我假设您的问题是一个简单的情况,但有一些好处:对象总是通过引用传递,分配给对象属性的值本身可以通过引用访问。

例如:

$numbers = new \StdClass();
$numbers->a = 10;
$numbers->b = 100;
$numbers->c = 100;
$numbers->d = 100;

然后您在全局范围内使用$numbers->a代替$a - 或者通过引用使用其他变量$a = &$numbers->a;

function multiply(StdClass $numbers, $multiple = 2)
{
    // Iteration isn't directly achievable with StdClass but...
    foreach (get_object_vars($numbers) as $key => $value) {
        $numbers->$key *= $multiple;
    }
}

最后,我们的条件:

if (true === myCondition) {
    multiply($numbers);
}