繁体   English   中英

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

[英]Using for loop within if statement in PHP

我正在编写排班应用程序。 该语句检查通过预订额外的班次,用户是否违反了连续预订超过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变量由一个循环填充,该循环在变量名的末尾向前向前指定的天数返回,并根据该天数是否为夜班,返回该天数的true或false数组。

作为构建多个数组和进行复杂比较的一种替代方法,该替代方法仅使用2个数组,一个具有前几天的数组,另一个具有前瞻性。 我不确定100%是否包括他们要预订的日期,但是希望这个想法很容易就可以适应您的需求。

基本概念是向后看$p_lookback_night列表并计数1,在计数到0时停止。然后通过$p_lookforward_night列表执行类似的$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,则只需对值进行计数

&& 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
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM