在以下教程的上下文中:
设置可变数量参数的简单方法是设置 除前两个以外的所有内容均默认:
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:解决方案的格式必须为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,那么解决方案将最终完善。
答案 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的答案非常相似。