Php 4个变量之间的不同条件
折扣数组Php 4个变量之间的不同条件,php,conditional-statements,Php,Conditional Statements,折扣数组 $Discount=arrray( 0=>array('FromArea'=>0,'ToArea'=>0,'Master'=>0,'Slave'=>0), 1=>array('FromArea'=>0,'ToArea'=>10,'Master'=>5,'Slave'=>0), 2=>array('FromArea'=>5,'ToArea'=>0,'Master'=>0,'Slave'=>8
$Discount=arrray(
0=>array('FromArea'=>0,'ToArea'=>0,'Master'=>0,'Slave'=>0),
1=>array('FromArea'=>0,'ToArea'=>10,'Master'=>5,'Slave'=>0),
2=>array('FromArea'=>5,'ToArea'=>0,'Master'=>0,'Slave'=>8),
3=>array('FromArea'=>0,'ToArea'=>0,'Master'=>1,'Slave'=>2),
4=>array('FromArea'=>0,'ToArea'=>1,'Master'=>7,'Slave'=>5),
...
)
我想根据函数的输入参数获取折扣金额
如果!清空参数,然后在数组中检查它
像这样
function DiscountAmount($FromArea, $ToArea, $Master, $Slave){
foreach ($Discounts as $R) {
if (!empty($FromArea) && empty($ToArea) && empty($Master) && empty($Slave)) {
if ($R["FromArea"] == $FromArea)
return true;
} else if (!empty($FromArea) && !empty($ToArea) && empty($Master) && empty($Slave)) {
if ($R["FromArea"] == $FromArea && $R["ToArea"] == $ToArea)
return true;
} else if (!empty($FromArea) && !empty($ToArea) && !empty($Master) && empty($Slave)) {
if ($R["FromArea"] == $FromArea && $R["ToArea"] == $ToArea && $R["Master"] == $Master)
return true;
} else if (!empty($FromArea) && !empty($ToArea) && !empty($Master) && !empty($Slave)) {
if ($R["FromArea"] == $FromArea && $R["ToArea"] == $ToArea && $R["Master"] == $Master && $R["Slave"] == $Slave)
return true;
} else if (!empty($FromArea) && !empty($ToArea) && !empty($Master) && !empty($Slave)) {
if ($R["FromArea"] == $FromArea && $R["ToArea"] == $ToArea && $R["Master"] == $Master && $R["Slave"] == $Slave)
return true;
}
...
}
}
$amout=DiscountAmount(0, 0, 0, 0);
$amout=DiscountAmount(1, 0, 0, 0);
$amout=DiscountAmount(0, 1, 0, 0);
$amout=DiscountAmount(0, 0, 1, 0);
$amout=DiscountAmount(0, 0, 0, 1);
$amout=DiscountAmount(1, 1, 0, 0);
$amout=DiscountAmount(1, 0, 1, 0);
$amout=DiscountAmount(1, 0, 0, 1;
$amout=DiscountAmount(1, 1, 1, 0);
$amout=DiscountAmount(1, 1, 0, 1);
$amout=DiscountAmount(1, 1, 1, 0);
$amout=DiscountAmount(1, 1, 1, 1);
....
但用这种方法,你必须检查每一个案例。有没有更简单的解决方案
function DiscountAmount($FromArea, $ToArea, $Master, $Slave)
{
//This line's simply to save time: if all fields are empty, no need to check further
if(empty($FromArea) && empty($ToArea) && empty($Master) && empty($Slave))
return true;
foreach ($Discounts as $R)
if (equiv($FromArea, $R["FromArea"]) &&
equiv($ToArea, $R["ToArea" ]) &&
equiv($Master, $R["Master" ]) &&
equiv($Slave, $R["Slave" ]))
return true;
return false;
}
function equiv($Field,$OtherField)
{
if (empty($Field)) return true;
else return $Field == $OtherField;
}
这应该不会那么笨重
function DiscountAmount($FromArea = null, $ToArea = null, $Master = null, $Slave = null) {
global $Discounts; //pull discount array into the function
$argsCount = count(func_get_args()); //the number of arguments filled in
$checkArray = array(
'FromArea' => $FromArea, 'ToArea' => $ToArea, 'Master' => $Master, 'Slave' => $Slave
);
while (count($checkArray) < $argsCount) {
array_pop($checkArray);
}
foreach ($Discounts as $R) {
if ($checkArray == $R) { //checks if all key/value pairs are equal
return true;
}
}
return false;
}
这应该不会太笨重。我认为这将消除冗余:
function DiscountAmount($FromArea = null, $ToArea = null, $Master = null, $Slave = null) {
global $Discounts; //pull discount array into the function
$argsCount = count(func_get_args()); //the number of arguments filled in
$checkArray = array(
'FromArea' => $FromArea, 'ToArea' => $ToArea, 'Master' => $Master, 'Slave' => $Slave
);
while (count($checkArray) < $argsCount) {
array_pop($checkArray);
}
foreach ($Discounts as $R) {
if ($checkArray == $R) { //checks if all key/value pairs are equal
return true;
}
}
return false;
}
function DiscountAmount($Parameters){
foreach ($Discounts as $R) {
foreach ($Parameters as $PK => $P) {
$CheckFlag = true;
if (!empty($P)) {
if ($R[$PK] != $P) {
$CheckFlag = false;
break;
}
}
}
if (!empty($CheckFlag)) { return true; }
}
return false;
}
假设:
根据问题代码和公认答案:
如果任何数组具有与输入值匹配的非空值,则函数必须返回true
若所有输入数组都为空,则函数必须返回true
测验
我认为这将消除冗余:
function DiscountAmount($Parameters){
foreach ($Discounts as $R) {
foreach ($Parameters as $PK => $P) {
$CheckFlag = true;
if (!empty($P)) {
if ($R[$PK] != $P) {
$CheckFlag = false;
break;
}
}
}
if (!empty($CheckFlag)) { return true; }
}
return false;
}
假设:
根据问题代码和公认答案:
如果任何数组具有与输入值匹配的非空值,则函数必须返回true
若所有输入数组都为空,则函数必须返回true
测验
尝试使用正则表达式:
function DiscountAmount($FromArea = null, $ToArea = null, $Master = null, $Slave = null){
if(empty($FromArea) && empty($ToArea) && empty($Master) && empty($Slave)) return true;
global $Discounts;
$json = json_encode($Discounts);
$reg = "/\{";
if(!empty($FromArea)) $reg .= "(?:[^\}]*\"FromArea\":{$FromArea})";
if(!empty($ToArea)) $reg .= "(?:[^\}]*\"ToArea\":{$ToArea})";
if(!empty($Master)) $reg .= "(?:[^\}]*\"Master\":{$Master})";
if(!empty($Slave)) $reg .= "(?:[^\}]*\"Slave\":{$Slave})";
$reg .= "[^\}]*\}/";
return preg_match($reg, $json);
}
尝试使用正则表达式:
function DiscountAmount($FromArea = null, $ToArea = null, $Master = null, $Slave = null){
if(empty($FromArea) && empty($ToArea) && empty($Master) && empty($Slave)) return true;
global $Discounts;
$json = json_encode($Discounts);
$reg = "/\{";
if(!empty($FromArea)) $reg .= "(?:[^\}]*\"FromArea\":{$FromArea})";
if(!empty($ToArea)) $reg .= "(?:[^\}]*\"ToArea\":{$ToArea})";
if(!empty($Master)) $reg .= "(?:[^\}]*\"Master\":{$Master})";
if(!empty($Slave)) $reg .= "(?:[^\}]*\"Slave\":{$Slave})";
$reg .= "[^\}]*\}/";
return preg_match($reg, $json);
}
也许,不必为函数使用4个独立的参数,您可以使用单个参数构建它,该参数是长度为4的数组,然后在参数上迭代。我会试着把我的代码想法作为一个答案。自从上次我使用PHPif你可以设置伪代码以来,已经有很长时间了。这花了我很多时间,因为我在手机上上网,但我确实发布了答案。我重新分析了问题,改进了我的答案。也许请检查一下,您可以使用单个参数(长度为4的数组)构建函数,而不是为函数使用4个独立的参数,然后对参数进行迭代。我会试着把我的代码想法作为一个答案。自从上次我使用PHPif你可以设置伪代码以来,已经有很长时间了。这花了我很多时间,因为我在手机上上网,但我确实发布了答案。我重新分析了问题,改进了我的答案。请检查它没有这种方式不能设置&&对输入我想你不会需要它。请使用代码进行rubberduck调试,您将看到。如果我没有错的话,我所做的循环将检查a、b、c、d的任意组合,只检查非空参数,除非你想插入布尔表达式作为参数。。。在这种情况下,我可能忽略了一些东西,我的样本在这种情况下是无效的。没有这种方法,无法设置输入(&I),我想你不会需要它。请使用代码进行rubberduck调试,您将看到。如果我没有错的话,我所做的循环将检查a、b、c、d的任意组合,只检查非空参数,除非你想插入布尔表达式作为参数。。。在这种情况下,也许我确实忽略了一些东西,我的样本对这种情况无效。你没有向我们提供很多信息。你没说它怎么不起作用。我不知道你的输出是什么,也不能按原样运行你的代码。为什么不告诉我们呢?在ideone.com/l38zVQ上检查你的代码你的代码一直都不正确答案我看到你已经把代码复制到了那个网站。你没有说它是如何不起作用的,或者在什么情况下。我不知道你的输出是什么。为什么不告诉我们?我很高兴你找到了解决办法。请点击该答案旁边的复选标记,并给予ChiliNut评分。@Will-Briggs代码只需要在开始时检查所有变量是否为空,但代码是正确的。您没有向我们提供大量信息。你没说它怎么不起作用。我不知道你的输出是什么,也不能按原样运行你的代码。为什么不告诉我们呢?在ideone.com/l38zVQ上检查你的代码你的代码一直都不正确答案我看到你已经把代码复制到了那个网站。你没有说它是如何不起作用的,或者在什么情况下。我不知道你的输出是什么。为什么不告诉我们?我很高兴你找到了解决办法。请单击该答案旁边的复选标记并给予ChiliNut分数。@Will-Briggs代码只需要检查所有变量是否在开头为空,但代码是正确的。我已经在我的环境中对其进行了测试,结果是1我代码中的变量为$折扣,您在开头用s声明$折扣。请用正确的变量名再次检查,我的代码运行得很好。如果所有参数都为空,您想返回true吗?那么您不需要在@Will-Briggs代码的开头进行检查。结果将是1,这是真的。在我的代码中,如果不进行检查,如果所有变量都为空,结果将是1。我很高兴你解决了你的问题;我已经在我的环境中对它进行了测试,结果是1我的代码中的变量是$折扣,您在开始时用s声明$折扣。请用正确的变量名再次检查,我的代码运行得很好。如果所有参数都为空,您想返回true吗?那么您不需要在@Will-Briggs代码的开头进行检查。r
esult将是1,这是真的。在我的代码中,如果不进行检查,如果所有变量都为空,则结果将是1。我很高兴你解决了你的问题;