2017-09-19 6 views
1

複数の医師のキャビネットから1人の医師との会議を予約できるように、利用可能な時間帯の日単位のカレンダーを作成する必要があります。オーバーラップするタイムスロットの配列を無効にする方法

私は

がところで私はLaravel 5.5

を使用ここでは一例です。..この説明は、すでにあまりにも奇妙ではないことを願っています:キャビネットの

デフォルトスケジュール:19時00分9:00

医師1は月曜日で、彼は唯一の役に立つだろうと述べている月曜日に、彼は夜03時

医師2に13:00からのみ利用可能になるだろうと述べています10時から14時00分

にでき、私は利用可能なタイムスロット照会する場合:

$ids = Doctor::all()->pluck('id'); 
$workingSchedules = WorkingSchedule::whereIn('user_id', $ids) 
         ->orderBy('start_date') 
         ->whereDate('start_date', '=', $this->datetime->format('Y-m-d')) 
         ->get(); 

を私が取得:

0 => [ 
    "start_date" => "2017-09-18 10:00:00" 
    "end_date" => "2017-09-18 14:00:00" 
] 
1 => [ 
    "start_date" => "2017-09-18 13:00:00" 
    "end_date" => "2017-09-18 15:00:00" 
] 

そして何もデータベースから現れていないならば、私はデフォルトを使用キャビネット時間。

次に、Carbon diffInMinutes()メソッドを使用して、(ユーザーが選択できる)日付範囲の間に30分のタイムスロットの配列を作成します。私は、この例では2つのタイムスロットを持っていたよう

0 => [ 
    "start_date" => "2017-09-18 10:00:00" 
    "end_date" => "2017-09-18 15:00:00" 
] 

が、それは簡単な解決策になるかもしれませんが、私は可能性があります:私のスクリプトは正しく機能させるためにため

とにかく、私は私がこれにお見せした結果を変換する必要があります

可能性のあるすべてのケースをカバーする洗練されたソリューションを見つけるのを誰かが助けてくれるのですか?

ありがとうございます。

+0

デフォルトのスケジュールの役割は何ですか?結果を決定するのは無関係ですか? – trincot

+0

医者1は13:00から15:00まで、医者2は16:00から17:00まで利用できますか? –

+0

@trincot医師が就業予定を入力しない場合、デフォルトの営業時間が使用されるようになります。 –

答えて

1

時間帯が重複マージするには、このコードを使用することができます。

$result = []; 
$i = -1; 
foreach ($workingSchedules as $row) { 
    if ($i < 0 || $row["end_date"] > $result[$i]["end_date"]) { 
     if ($i >= 0 && $row["start_date"] <= $result[$i]["end_date"]) { 
      $result[$i]["end_date"] = $row["end_date"]; 
     } else { 
      $result[++$i] = $row; 
     } 
    } 
} 

$resultは、唯一の非オーバーラップ期間を持つことになります。

+0

Mhしかし、このコードは動作しません、あなたは不定のオフセットを取得します:-1 –

+0

@ClémentRigo、試しましたか?それは[eval.in](https://eval.in/864600)で正常に動作しています。とにかく、私は安全を追加しました。 – trincot

+0

今、それは正常に動作します!ありがとう!! –

2

より簡単にするために、私は$ workingSchedulesを仮定しますが、数値の配列である、そして我々は簡単に

$workingSchedules = [ 
    [ 
     'start_date' => 1, 
     'end_date' => 5, 
    ], 
    [ 
     'start_date' => 13, 
     'end_date' => 16, 
    ], 
    [ 
     'start_date' => 16, 
     'end_date' => 17, 
    ], 
]; 

$result = [$workingSchedules[0]]; 
$index = 0; 
foreach ($workingSchedules as $row) { 
    if ($result[$index]['end_date'] >= $row['start_date']) { 
     $result[$index]['end_date'] = max($result[$index]['end_date'], $row['end_date']); 
    } else { 
     $index++; 
     $result[] = $row; 
    } 
} 

var_dump($result); 

コード上記の要素を比較することができます印刷します:

[ 
    [ 
     'start_date' => 1, 
     'end_date' => 5, 
    ], 
    [ 
     'start_date' => 13, 
     'end_date' => 17, 
    ], 
] 
  1. をカスタムすることができます2つの日付を比較するコード
  2. $ workingSchedulesが空の場合、デフォルトのスケジュール
  3. を返すことができます
+0

これも完璧に動作します!どうもありがとう :) –

0

私はこれが役に立ちそうです。

$workingSchedules=array(
    0=>array(
    "start_date" => "2017-09-18 10:00:00", 
    "end_date" => "2017-09-18 14:00:00"), 
    1=>array(
     "start_date" => "2017-09-18 13:00:00", 
     "end_date" => "2017-09-18 15:00:00" 
    ) 
); 



foreach ($workingSchedules as $schedule){ 
    $start=new DateTime($schedule['start_date']); 
    $end=new DateTime($schedule['end_date']); 

    while ($start<=$end){ 
     echo $start->format('Y-m-d H:i')."<br/>"; 
     $start=$start->add(new DateInterval('PT'.'30'.'M')); 
    } 
} 
関連する問題