Дисконтный массив
$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),
...
)
Я хочу получить базовую сумму скидки на входной параметр функции.
Если! Empty (параметр), то проверьте его в массиве
Как это
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 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){
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) {
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