2010-12-27 36 views
0

私は、いくつかの部門の作業時間に関する情報を表す5つのパラメータを取得する関数を作成する必要があります。
- 作業が開始/終了するとき、
- 昼休み(または他の休憩)が開始/終了するとき、
- 時間を分けるべき小数を表す整数。php - 時間間隔を等間隔に分割する

さらに、勤務時間に休憩がない可能性があります。

この関数は、作業時間からすべての間隔を返す必要があります。私は機能

function split_time_into_intervals("8:30","14:50","11:45", "12:25"); 

の次のパラメータを持っている場合

function split_time_into_intervals($work_starts,$work_ends,$break_starts=null; 
      $break_ends=null,$minutes_per_interval=60) 
{ 
    $intervals=array(); 

    //all of the function code 
    return $intervals; 
} 

だから私は、次の配列を取得したいと思います:

$intervals[0]['starts']="8:30"; 
$intervals[0]['ends']="9:30"; 
$intervals[1]['starts']="9:30"; 
$intervals[1]['ends']="10:30"; 
$intervals[2]['starts']="10:30"; 
$intervals[2]['ends']="11:30"; 
$intervals[3]['starts']="11:30"; 
$intervals[3]['ends']="11:45"; 

//this interval was smaller than 60 minutes - because of the break (which starts at 11:45) 
$intervals[4]['starts']="12:25";//starts when the break ends 
$intervals[4]['ends']="13:25"; // interval is again 60 minutes 
$intervals[5]['starts']="13:25"; 
$intervals[5]['ends']="14:25"; 
$intervals[6]['starts']="14:25"; 
$intervals[6]['ends']="14:50"; 

//this period is shorter than 60 minutes - because work ends 

は、任意のアドバイス?私はこの問題に関連するPHP(またはC#)コードをapriciateします!

+1

これは宿題ですか? – Jacco

+0

それは通常の宿題ではなく、私のPHPプロジェクトでは1つの機能に過ぎず、プロジェクト全体が私の「宿題」(実際のコース用紙) – experc

答えて

0

Finaly私は私の問題を解決するのに役立ちます願っています!おかげで、関心のためtharkun! この瞬間、私はそれがしたいと、それは働く!私はで場合によってはこの関数がいくつかのバグで動作するかもしれないので、それらが表示されているかどうかを知りたいと思います。 今のところ2つの機能があります。ソーリー、もしそれが短く、より最適化されているかもしれないが、少なくともそれは動作する!

//Author: Elvijs Kukša 
function splitTimeIntoIntervals($work_starts,$work_ends,$break_starts=null,$break_ends=null,$minutes_per_interval=60){ 
$intervals=array(); 
$time = date("H:i",strtotime($work_starts)); 
$first_after_break=false; 
while(strtotime($time) < strtotime($work_ends)){ 
// if at least one of the arguments associated with breaks is mising - act like there is no break 
    if($break_starts==null || $break_starts==null) 
    { 
    $time_starts=date("H:i", strtotime($time)); 
    $time_ends=date("H:i", strtotime($time_starts."+$minutes_per_interval minutes")); 
    } 
// if the break start/end time is specified 
    else{ 
    if($first_after_break==true){//first start time after break 
    $time=(date("H:i",strtotime($break_ends))); 
    $first_after_break=false; 
    } 
    $time_starts=(date("H:i",strtotime($time))); 
    $time_ends=date("H:i", strtotime($time_starts."+$minutes_per_interval minutes")); 
//if end_time intersects break_start and break_end times 
    if(timesIntersects($time_starts, $time_ends, $break_starts, $break_ends)) 
    { 
    $time_ends=date("H:i",strtotime($break_starts)); 
    $first_after_break=true; 
    } 
    } 
    //if end_time is after work_ends 
    if(date("H:i", strtotime($time_ends))>date("H:i",strtotime($work_ends))) 
    { 
    $time_ends=date("H:i",strtotime($work_ends)); 
    } 
    $intervals[] = array('starts' =>$time_starts, 'ends' => $time_ends); 
    $time=$time_ends; 
} 
return $intervals; 
} 
//time intersects if order of parametrs is one of the following 1342 or 1324 


function timesIntersects($time1_from,$time1_till, $time2_from, $time2_till){ 
    $out; 
    $time1_st=strtotime($time1_from); 
    $time1_end=strtotime($time1_till); 
    $time2_st=strtotime($time2_from); 
    $time2_end=strtotime($time2_till); 
    $duration1 =$time1_end - $time1_st; 
    $duration2 = $time2_end - $time2_st; 
    $time1_length=date("i",strtotime($time1_till."-$time1_from")); 
    if(
      (($time1_st<=$time2_st&&$time2_st<=$time1_end&&$time1_end<=$time2_end) 
      || 
      ($time1_st<=$time2_st&&$time2_st<=$time2_end&&$time2_end<=$time1_end) 
      && 
      ($duration1>=$duration2) 
      ) 
      || 
      ($time1_st<=$time2_st&&$time2_st<=$time1_end&&$time1_end<=$time2_end) 
      && 
      ($duration1<$duration2) 
      ) 
    { 
     return true; 
    } 


    return false; 
} 
0

まあ、これは少しuneffectiveかもしれませんが、あなたはこれを試みることができる(私はそれをテストしていない、それは多少の誤差があるかもしれませんが、それは似て何かを動作するはずです。もちろん

$time = $work_starts; 

while($time < $work_ends) 
{ 
    if(($break_starts !== null) && ($time + 60 <= $break_starts)) 
    { 
     $intervals[] = array('starts' => $time, 'ends' => ($time += 60)); 
    } 
    else if($break_starts !== null) 
    { 
     $time = $break_ends; 
    } 
    else if($time + 60 <= $work_ends) 
    { 
     $intervals[] = array('starts' => $time, 'ends' => ($time += 60)); 
    } 
} 

$time += 60これはpseudoalgorithmである。加える実際の分に変換する必要があります。

はそれが