Различное условие между 4 переменными

1

Дисконтный массив

 $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);
....

Онлайн-демонстрация Но таким образом вы должны проверить очень случай. Есть ли более простое решение?

  • 1
    Возможно, вместо того, чтобы использовать 4 независимых параметра для функции, вы можете построить ее с одним параметром (который будет массивом с длиной 4) и затем выполнить итерацию по параметру. Я постараюсь опубликовать свою идею кода в качестве ответа (прошло много времени с тех пор, как я в последний раз использовал PHP)
  • 0
    если вы можете установить псевдокод, который делает это
Показать ещё 2 комментария
Теги:
condition

4 ответа

2
Лучший ответ
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;
}

Это должно быть значительно менее неуклюжим.

  • 0
    Это не сработало проверил ideone.com/l38zVQ
  • 0
    Вы не предоставляете нам много информации. Вы не сказали, как это не сработало. Я не знаю, для чего предназначен ваш вывод, и я не могу запустить ваш код как есть. Почему бы не сказать нам?
Показать ещё 6 комментариев
2

Попробуйте с регулярным выражением:

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);     

}
  • 0
    Ваш код неверен ideone.com/cI0np0
  • 0
    Я проверил это в моей среде, и результат 1
Показать ещё 8 комментариев
2
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;
}
  • 0
    Да, ваш код правильный ideone.com/y05IoL
1

Я думаю, что это устранит избыточность:

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

Контрольная работа

http://ideone.com/otiUJw

  • 0
    Нет с этим способом нельзя установить && на входе
  • 0
    Я думаю, тебе это не понадобится. Пожалуйста, сделайте отладку с помощью кода кода, и вы увидите. Если я не ошибаюсь, цикл, который я сделал, будет проверять любую комбинацию (a, b, c, d), проверяя только непустые параметры
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню