PHP и вложенные условия - PullRequest
0 голосов
/ 04 марта 2019

в PHP (и даже в других языках, но в данном случае это больше для PHP), я часто заканчиваю тем, что иногда приходится кодировать длинные условия, такие как пример ниже:

У меня есть код со многимиусловия, и я хочу отобразить другой результат, основанный на определенных условиях.

  • , если что-то КРАСНОЕ, а другая вещь КРАСНАЯ, то выведите X,
  • , если что-то КРАСНОЕ, ноДругая вещь - ЧЕРНАЯ, затем выведите Y
  • , если что-то КРАСНОЕ, а другая вещь КРАСНАЯ, а третья - синяя, то выведите X
  • и т. д.

есть ли способ правильно справиться с этим, используя какие-то данные структура / массив конфигурации / матрица / что угодно ?то есть правильно хранить эти «условия» и «результаты» в каком-то массиве конфигурации или в другом?

вместо того, чтобы кодировать вложенные условия, которые потом сложно поддерживать, как в этом очень маленьком примере, но вгораздо больший масштаб

if (preg_match(/something/, $string) {
  $result = 'GREEN';
} elseif (preg_match(/something/, $string) {
  $result = 'RED';
} else {
  if (something else) {
    $result = 'GREEN';
  } else {
    if (something OR something) {
       $result = 'AMBER';
    } else {
       $result = 'GREEN';
    }
  }
}

или это единственный способ справиться с этим?может быть, с одним

if (something and something or something) {

} elseif (something and something and something) {

} elseif (something and something or something and something) {

} etc

спасибо за вашу помощь

Я кодирую приложение, которое должно отображать различное «состояние» для определенных данных в зависимости от множества различных данных (других атрибутовэтих данных), и я хотел бы избежать нечитаемого кода

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Вы можете использовать вложенные массивы:

$conditions = [
    '/something1/' => [
        '/something2/' => "X"
    ],
    'thing3' => [
        '/thing3/' => 'Y',
        '/thing4/' => 'Z'
    ]
];
$matched = false;
foreach ($conditions as $key1 => $val1) {
    if (preg_match($key1, $string)) {
        if (is_array($val1)) {
            foreach ($val1 as $key2 => $val2) {
                if (preg_match($key2, $string)) {
                    $result = $val2;
                    $matched = true;
                    break;
                }
            }
        } else {
            $result = $val1;
            $matched = true;
        }
    }
    if ($matched) {
        break;
    }
}
if (!$matched) {
    $result = 'default';
}

Чтобы разрешить произвольные уровни вложенности, вы можете превратить это в рекурсивную функцию.

0 голосов
/ 04 марта 2019

Аналогично @dearsina, я бы хотел разделить его на функции для такого рода вещей, например, если вы знаете, что во многих случаях он может возвращать одно и то же значение, например:

if(isGreen($string)) return 'GREEN';
else if (isRed($string)) return 'RED';

function isGreen($string) {
    if(cond1)return true;
    if(cond2 && cond3)return true;
    if(cond4 || cond 5)return true;
    return false;
}

function isRed($string) {
    if(cond6)return true;
    if(cond1 && cond7)return true;
    if(cond2 || cond 8)return true;
    return false;
}

мы иногда используем предложенный вами стиль ...

if (something and something or something) {

} else if (something and something and something) {

, но вы можете быстро вернуться к тем же проблемам с удобочитаемостью и обслуживанием

0 голосов
/ 04 марта 2019

Для целей ответа ниже я предполагаю, что вы кодируете OO PHP .

Одна переменная

Когда у меня есть Одна переменная, которая определяет результат, если переменная логическая или близка к логической (то есть может иметь одно или два разных значения), должна использовать оператор if(), как у вас.Если переменная может иметь различные (известные) значения, например, ваш пример цвета, я использую функцию switch().

Две или более переменных

Если у меня есть две переменные, которые определяют результат, например, цвет и размер, я сначала использую switch(), затем для каждого переключателя я использую метод, который содержит еще switch().

Это может быть более многословно, но намного легче отслеживать в долгосрочной перспективе.Ниже приведен упрощенный пример логики.

switch ($colour) {
case 'red':
    red_handler($size);
    break;

case 'green':
    green_handler($size);
    break;

case 'blue':
    blue_handler($size);
    break;
}

/** We already know the first variable value is red */
function red_handler($size)
{
    switch ($size) {
    case 'small':
        echo "my fruit is a cherry";
        break;

    case 'medium':
        echo "my fruit is an apple";
        break;

    case 'large':
        echo "my fruit is a watermelon";
        break;
    }
}
...