在PHP中的if语句中使用for循环

时间:2018-05-31 07:30:22

标签: php for-loop if-statement

我正在写一个排班应用程序。该声明通过预订额外班次来检查用户是否违反了规则,即他们连续预订了7晚以上的班次。这段代码运行正常,但我试图找到一种更优雅的方式来编写它,例如在if语句中使用for循环。这个片段存在于更大的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 :(得分:1)

作为构建多个数组和复杂比较的替代方法,此替代方案仅使用2个数组,一个具有前几天,一个具有前瞻性。我不是百分之百确定这是否包括他们试图预订的那一天,但希望这个想法很容易适应您的需求。

基本概念是向后查看$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个。

答案 1 :(得分:0)

假设在这种情况下所有这些数组只能包含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
  }
}