2016-12-06 13 views
0

講師が利用可能かどうかを示すスケジューリング用のコードを作成する必要があります。PHPで2つの多次元配列を相違させる

availability: [ 
    '2016-12-01': [ 
     0: ['start': '08:00:00', 'end': '09:30:00'], 
     1: ['start': '09:30:00', 'end': '11:00:00'], 
     2: ['start': '11:00:00', 'end': '12:30:00'], 
     3: ['start': '12:30:00', 'end': '14:00:00'], 
     4: ['start': '14:00:00', 'end': '15:30:00'], 
     5: ['start': '15:30:00', 'end': '17:00:00'], 
     6: ['start': '17:00:00', 'end': '18:30:00'], 
     7: ['start': '18:30:00', 'end': '20:00:00'] 
    ] 
] 

をしかし、今、私たちはインストラクターがあるときに、データベースから取得する必要があります:

$begin = new \DateTime('first day of this month'); 
    $end = new \DateTime('last day of this month'); 

    $dailyInterval = new \DateInterval('P1D'); 
    $dailyPeriod = new \DatePeriod($begin, $dailyInterval, $end); 
    $data = []; 

    /** @var \DateTime $date */ 
    foreach($dailyPeriod as $date) 
    { 
     $currentDate = $date->format('Y-m-d'); 
     $start = new \DateTime("$currentDate 08:00"); 
     $finish = new \DateTime("$currentDate 20:00"); 

     $appointmentInterval = new \DateInterval($appointmentVariant->getInterval()); 
     $appointmentPeriod = new \DatePeriod($start, $appointmentInterval, $finish); 

     /** @var \DateTime $duration */ 
     foreach($appointmentPeriod as $duration) 
     { 
      $endDate = clone $duration; 
      $data['availability'][$currentDate][] = [ 
       'start' => $duration->format('H:i:s'), 
       'end' => $endDate->modify('+90 minutes')->format('H:i:s') 
      ]; 
     } 
    } 

これの出力は次のとおりです。

は、だから私は、次の(月)の期間を行いました(複数のソース、予定、休暇、定期的なイベントなどから来る可能性があります)、最終的には上記のような配列がありますが、使用できません:

unavailability: [ 
    '2016-12-01': [ 
     0: ['start': '14:30:00', 'end': '16:30:00'], 
     1: ['start': '18:00:00', 'end': '18:20:00'], 
    ] 
] 

今は疑問です。インストラクターが利用可能になったときにそれらの2つの配列をどのようにして最終的なものにするのですか?利用可能な日付と時刻、そして利用できない日付と時刻をループするのはかなり難しいです。

diffは(DELを削除する=)私に次のような結果をお返しする必要があります

availability: [ 
    '2016-12-01': [ 
     0: ['start': '08:00:00', 'end': '09:30:00'], 
     1: ['start': '09:30:00', 'end': '11:00:00'], 
     2: ['start': '11:00:00', 'end': '12:30:00'], 
     3: ['start': '12:30:00', 'end': '14:00:00'], 
     DEL 4: ['start': '14:00:00', 'end': '15:30:00'], 
     DEL 5: ['start': '15:30:00', 'end': '17:00:00'], 
     DEL 6: ['start': '17:00:00', 'end': '18:30:00'], 
     7: ['start': '18:30:00', 'end': '20:00:00'] 
    ] 
] 

誰もがそれを行うための最も効率的な方法を知っていますか?

答えて

0

日を10分ブロックに分割してください。データベースからの使用不可能に応じて、これらの設定を解除することができます。

その後、その日の最小値/最大値を使用して開始値と終了値を出力できます。

これが役に立ちます。

+1

幸運

汚れになりますが、あなたに、先端のHAWXをありがとうございます。あなたは正しい、10分のブロックに一日を分割する方法は簡単です – undefinedman

0
$unavailability = your unavailability array(); 
$availability = your availability array(); 
//this loop will procedd how much your availability in your ex : will be 1 
foreach($availability as $key=>$val) 
{ 
    if(isset($unavailability[$key])) 
    { 
     //6 times loop 
     foreach($val as $new_key => $new_val) 
     { 
      2 times loop 
      foreach($unavailability[$key] as $unavailkey => $unavail_val) 
      { 
       if($new_val['start'] >= $unavail_val['start']) 
       { 
        unset($new_val) 
       } 
       else 
       { 
        continue; 
       } 
      } 
     } 
    } 
    else 
    { 
     continue; 
    } 

} 

あなたのデザイン結果データが複雑すぎると、それは非常にトリッキーで、パフォーマンスの問題に直面することがあります。

そのあまりにもassosiativeアレイを使用して行うことができますが、コードは

+0

ありがとうエヴィン、それは私に確かにいくつかのアイデアを与えた。私が直面していた最大の問題はパフォーマンスの問題でした。だから、私はdiffの全体的なアイデアを考え直さなくてはなりませんでした。 – undefinedman