我正在写一个排班应用程序。该声明通过预订额外班次来检查用户是否违反了规则,即他们连续预订了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
变量由一个循环填充,在循环中查找变量名称末尾的指定天数,并返回该天数的真或假数组,具体取决于这些天数是否为夜班或不夜班。
答案 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
}
}