Использование цикла for внутри оператора if в PHP - PullRequest
0 голосов
/ 31 мая 2018

Я пишу составное приложение.Это утверждение проверяет, что, заказывая дополнительную смену, пользователь не нарушает правило, согласно которому он заказал более 7 ночных смен подряд.Этот код работает нормально, но я пытаюсь найти более элегантный способ написать его, например, используя цикл for в операторе if.Этот фрагмент существует в большем цикле while.

if (
    $original_shift->night_shift==true &&
    $p_lookback_night_7===[1,1,1,1,1,1,1] || $p_lookforward_night_7===[1,1,1,1,1,1,1] ||
    ($p_lookback_night_1===[1] && $p_lookforward_night_6===[1,1,1,1,1,1]) ||
    ($p_lookback_night_2===[1,1] && $p_lookforward_night_5===[1,1,1,1,1]) ||
    ($p_lookback_night_3===[1,1,1] && $p_lookforward_night_4===[1,1,1,1]) ||
    ($p_lookback_night_4===[1,1,1,1] && $p_lookforward_night_3===[1,1,1]) ||
    ($p_lookback_night_5===[1,1,1,1,1] && $p_lookforward_night_2===[1,1]) ||
    ($p_lookback_night_6===[1,1,1,1,1,1] && $p_lookforward_night_1===[1])
) {
    return 'You can\'t do more than 7 night shifts in a row'; 
    break;
}

Переменные $p_look заполняются циклом, смотрящим назад или вперед на указанное количество дней в конце имени переменной и возвращающим массивистина или ложь для этого количества дней в зависимости от того, являются ли это ночными сменами или нет.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

В качестве альтернативы построению нескольких массивов и сложных сравнений, эта альтернатива просто использует 2 массива, один с предыдущими днями и один с нетерпением.Я не уверен на 100%, если это касается дня, когда они пытаются забрать деньги, но, надеюсь, идею достаточно легко приспособить к вашим потребностям.

Основная идея - оглянуться назад сквозь $p_lookback_nightперечислите и посчитайте 1, останавливаясь, когда он достигает 0. Затем он делает то же самое через список $p_lookforward_night.Конечный результат - это число 1 в ряду ...

$p_lookback_night = [0,0,0,0,1,1];
$p_lookforward_night = [1,1,1,1,0,0];
$run = 0;
foreach (array_reverse($p_lookback_night) as $test )  {
    if ( $test == 1 )    {
        $run++;
    }
    else    {
        break;
    }
}

foreach ($p_lookforward_night as $test )  {
    if ( $test == 1 )    {
        $run++;
    }
    else    {
        break;
    }
}

echo $run;

С данными теста это дает 6, так что вы можете использовать это, чтобы решить, пытаются ли они забронировать 7 подряд.

0 голосов
/ 31 мая 2018

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

&& count($p_lookback_night_7)===7 || ...

Возможно, даже использовать int в конце динамически, но это, вероятно, будет больше проблем, чем оно того стоит,Что-то вроде

for($i=1;$i<8;$i++){
  if(count(${"p_lookback_night_".$i}) == $i && count(${"p_lookforward_night_".$i}) == $i ){
  ..wahtever
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...