2016-06-15 22 views
0

私はこのようなシナリオを持っています。私は、以下のような残業の設定をしているとしましょう。配列にすることができます。時間の範囲が時間範囲内であることを確認してください。

Array  From  Until 
[0]  5:00 AM 7:00 AM 
[1]  6:00 PM 9:00 PM 

次に、私は残業をするようになります。実際の残業時間が上記の時間範囲に該当するかどうかを確認するにはどうすればよいですか?

OT Start  OT End  OT Start Allowed  OT End Allowed 
4:00 AM  6:30 AM 5:00 AM    6:30 AM 
5:30 AM  8:00 AM 5:30 AM    7:00 AM 
5:30 PM  8:00 PM 6:00 PM    8:00 PM 
6:30 PM  9:30 PM 6:30 PM    9:00 PM 
5:30 PM  9:30 PM 6:00 PM    9:00 PM 
5:30 AM  7:00 PM 5:30 AM    7:00 AM 
         6:00 PM    7:00 PM 
6:00 AM  10:00 PM 6:00 AM    7:00 AM 
         6:00 PM    9:00 PM 

は、システムがどのように扱うかだそれならば、そう、私はより多くのシナリオでは

OT Start Allowed OT End Allowed 
6:00 AM   7:00 AM 

を取得します

OT Start: 6:00 AM , OT End: 9:00 AM 

は例えば、私はで残業のために来ますシナリオ誰もがPHPでこれを行う方法を考えている?前もって感謝します。

+0

あなたの質問をフォーマットしてください、私の目はの –

+0

可能な重複[複数(n)の日時範囲が重なったときにPHPが決定]傷つける(http://stackoverflow.com/questions/36868675/php-determine-when -multiplen-datetime-ranges-overlap-each-other) –

+0

私は与えられた質問と答えを調べました。しかし、それでも私のシナリオに関連付けることはできません。 – EDDY

答えて

1

許容時間と実際の時間の各範囲のペアについて、許可期間が終了する前に実際の期間が始まり、開始後に終了することを確認する必要があります代理人>=>です)。その後、最新の開始時刻と最も早い終了時刻を取るだけです。

$permitted_hours = [["05:00", "07:00"], ["18:00", "21:00"]]; 

$claims = [["04:00", "06:30"], ["05:30", "08:00"], ["17:30", "20:00"], 
    ["18:30", "21:30"], ["17:30", "21:30"], ["05:30", "19:00"], ["06:00", "22:00"]]; 

echo "OT Start OT End OT Start Allowed OT End Allowed\n"; 
foreach ($claims as $claim) { 
    $first_match = true; 
    echo "$claim[0]  $claim[1] "; 
    foreach ($permitted_hours as $permitted) { 
     if ($claim[0] < $permitted[1] && $claim[1] > $permitted[0]) { 
      if (!$first_match) { 
       echo "\n     "; 
      } 
      $start = max($permitted[0], $claim[0]); 
      $end = min($permitted[1], $claim[1]); 
      echo "$start    $end"; 
      $first_match = false; 
     } 
    } 
    echo "\n"; 
} 
/* 
OT Start OT End OT Start Allowed OT End Allowed 
04:00  06:30 05:00    06:30 
05:30  08:00 05:30    07:00 
17:30  20:00 18:00    20:00 
18:30  21:30 18:30    21:00 
17:30  21:30 18:00    21:00 
05:30  19:00 05:30    07:00 
        18:00    19:00 
06:00  22:00 06:00    07:00 
        18:00    21:00 
*/ 
+0

これを行う方法について私が理解するのに4日かかりましたが、あなたが探していた答えで私をノックするのに4分しかかかりませんでした。華麗で偉大な努力と多くの感謝! :) – EDDY

関連する問題