PHP代码用于可变数量的参数

时间:2018-10-10 01:39:55

标签: php

在以下教程的上下文中:

  

设置可变数量参数的简单方法是设置   除前两个以​​外的所有内容均默认:

function my_add( $val1, $val2, $val3 = '', $val4 = '', $val5 = '' ){
     return $val1 + $val2;
}
     

您可以尝试以下类似操作,以确保值是数字,   否则返回0:

function my_add( $val1, $val2, $val3 = '0', $val4 = '0', $val5 = '0' ){
     if( !is_numeric( $val1 ) || !is_numeric( $val2 )){ // add checks for all the values
          return 0;  
     }
     return $val1 + $val2;
}

我已尝试将上述代码用于我的个人目的-尽管该代码可能是错误的,但我认为意图很明显:

function sum_warehouses_stock( $warehouse1, $warehouse2, $warehouse3 = '0', $warehouse4 = '0', $warehouse5 = '0' ){
         if( !is_numeric( $warehouse1 ) {
               $warehouse1 = 0;
         }
         if( !is_numeric( $warehouse2 ){
               $warehouse2 = 0;  
         }
         if( !is_numeric( $warehouse3 ){
               $warehouse3 = 0; 
         }
         if( !is_numeric( $warehouse4 ){
               $warehouse4 = 0;   
         }
         if( !is_numeric( $warehouse5 ){
               $warehouse5 = 0;   
         }
         return $warehouse1 + $warehouse2 + $warehouse3 + $warehouse4 + $warehouse5;
    }

但是我得到了

  

解析错误:语法错误,意外的';'在第26行的代码中

  1. 您能帮我纠正错误吗?
  2. 当我发现重复很多时,如何提高代码效率?

编辑1:要说明意图,函数应检查所有这些变量,并确保对于每个变量,如果它们的值不是数字,则将其值重新定义为零。然后对变量的值求和。

编辑2:解决方案的格式必须为function ($warehouse1, $warehouse2, $warehouse3),但应以更一般的形式表示为:function (/* array of a variable number of warehouses*/)

编辑3-这是我根据kojow7的答案运行的解决方案:

function ld_sum_warehouses_stock($a, $b, $c, $d, $e, $f){
$warehouses = array( $a, $b, $c, $d, $e, $f );
    $total = 0;
    foreach($warehouses as $warehouse){
        $warehouse = str_replace(["+","<",">"], "", $warehouse);
        if (is_numeric($warehouse)){
             $total += $warehouse;
        }
     }
     return $total;
}

它允许我调用单个函数并在单个调用中传递相关变量-这是我使用的插件的约束。

但是,在此阶段,代码不灵活,迫使我提交固定数量的变量。如果上面的代码可以重写为容纳可变数量的变量$ a,$ b到$ n,那么解决方案将最终完善。

5 个答案:

答案 0 :(得分:4)

正如另一个用户提到的那样,使用数组将所有变量传递并映射它们以获取结果是很好的。

如果要将参数保留在函数中,则另一个解决方案如下:请注意,$c, $d, $e, $f, $g等不存在。

function add($a, $b)
{
    $total = 0;

    // gets all args passed to this function, including those not listed.
    $args = func_get_args();

    foreach($args as $arg) {
        // check if argument value is numeric.
        if (is_numeric($arg)) {
            // ...if it is, add it to the running total.
            $total += $arg;
        }
    }

    return $total;
}

func_get_args是一种检索作为数组分配给函数的所有arg的方法。 考虑到这一点,如果要忽略它们,则必须删除前两个。 array_slice($args, 2)将从args数组中删除前2个项目($a and $b)。

我在这里所做的是遍历赋予函数的所有参数(包括前两个参数)并将它们加在一起。如果您仍打算将其添加到总计中,则没有理由将值设为0。您也可以进行相反的检查,确保该值是数字,然后再将其添加到总计中。

这样称呼它:

$result = add(1, 5, 77, 45, 885, 2456, 3, 5);

请注意,以下内容也可以使用,并忽略字符串:

$result = add(1, 5, 'ignores', 45, 'these', 2456, 'strings', 5);

答案 1 :(得分:1)

就像评论中所说的一样,您在if块上有一个错字,但缺少了)右括号。

对于变量的求和,为什么不使用数组呢?

这是主意:

function sum_warehouses_stock($warehouses) {
    return array_sum(array_map(function($w) {
        return !is_numeric($w) ? 0 : $w;
    }, $warehouses));
}

如果您期望一系列数字,只需将它们加载为数组,然后添加通常的is_numeric,最后添加array_sum。然后,您无需声明warehouse...n

要使用它:

echo sum_warehouses_stock([1, 2, 3, 0, 'a']);

答案 2 :(得分:1)

您缺少右括号。对于您当前的代码,这可以解决您的问题:

function sum_warehouses_stock( $warehouse1, $warehouse2, $warehouse3 = '0', $warehouse4 = '0', $warehouse5 = '0' ){
    if( !is_numeric( $warehouse1 ) ){
        $warehouse1 = 0;
    }
    if( !is_numeric( $warehouse2 ) ){
        $warehouse2 = 0;
    }
    if( !is_numeric( $warehouse3 ) ){
        $warehouse3 = 0;
    }
    if( !is_numeric( $warehouse4 ) ){
        $warehouse4 = 0;
    }
    if( !is_numeric( $warehouse5 ) ){
        $warehouse5 = 0;
    }

    return $warehouse1 + $warehouse2 + $warehouse3 + $warehouse4 + $warehouse5;
}

但是,您可能应该只传递一个数组参数,而不要在其中添加任意数量的$warehouseX

这可能是最简洁的:

function sum_warehouses_stock( $warehouses = array() ){
    return array_sum( $warehouses );
}

然后,无论您如何获取仓库值,即使它们返回空字符串或null,也基本上将其视为零。

$warehouses = array( 1, 7, 0, '', null );

echo sum_warehouses_stock( $warehouses ); // Result: "8"

答案 3 :(得分:1)

     if( !is_numeric( $warehouse1 ) ){
           $warehouse1 = 0;
     }
     if( !is_numeric( $warehouse2 ) ){
           $warehouse2 = 0;  
     }
     if( !is_numeric( $warehouse3 ) ){
           $warehouse3 = 0; 
     }
     if( !is_numeric( $warehouse4 ) ){
           $warehouse4 = 0;   
     }
     if( !is_numeric( $warehouse5 ) ){
           $warehouse5 = 0;   
     }

在关闭诸如(,{,[

关闭它们的通常问题是在圆括号上,尤其是当您在这些受控语句中使用方法时。请记住切圆括号的计数始终是右括号的数量

代码应为:

答案 4 :(得分:1)

正如其他人所说,您在每个if语句中都缺少右括号。您打开两个,但只关闭一个。

虽然Ghost的答案更为优雅,但它也更为先进。这是一种更简单的方法,它可能如何工作更清晰:

function sum_warehouses_stock($warehouses){

    $total = 0;
    foreach($warehouses as $warehouse){
        if (is_numeric($warehouse)){
             $total += $warehouse;
        }
     }
     return $total;
}

这将接受一组数字。然后它将遍历所有这些。如果是数字,它将添加到总数中。然后将返回总数。

要调用该函数,您需要向其传递一个值数组,例如:

sum_warehouses_stock([5,0,20]);

或可能根据您的情况:

$warehouses = array(qldstocklevel[1], vickstocklevel[1], wastocklevel[1]);
sum_warehouses_stock($warehouses);

可能有更好的方法来执行此操作,因为这每次只能将其修复为三个仓库。最好通过允许数量不定的仓库使其更通用。

更新

如果无法在函数外部创建值数组,那么最好使用func_get_args()函数,如下所示:

function sum_warehouses_stock(){

    $total = 0;
    $warehouses = func_get_args();

    foreach($warehouses as $warehouse){
        if (is_numeric($warehouse)){
             $total += $warehouse;
        }
     }
     return $total;
}

然后您可以在可变数量的仓库中调用它:

sum_warehouses_stock(1, 5, 9);

sum_warehouses_stock(qldstocklevel[1], vickstocklevel[1], wastocklevel[1]);

此答案现在与simonw16的答案非常相似。