4

他のSOの質問を確認しましたが、これに関連するものが見つからないようです。何かを見逃した場合は、正しい方向に向けてください。

私は現在、日時(要求された会議時間)を含む次の配列を持っています:

Array (
    [0] =>
        day => 'Thursday',
        start_time => '14:00',
        end_time => '15:00'
    [1] =>
        day => 'Thursday',
        start_time => '16:30',
        end_time => '17:30'
)

ユーザーは、これらの両方の時間に出席する必要があります。私がやろうとしているのは、ユーザーの現在の予定を含む別の配列と比較し、衝突/時間の重複の問題があるかどうかを検出することです

Array (
    [0] =>
        day => 'Monday',
        start_time => '09:00',
        end_time => '13:00'
    [1] =>
        day => 'Wednesday',
        start_time => '10:45',
        end_time => '11:15'
    [2] =>
        day => 'Thursday',
        start_time => '16:45',
        end_time => '17:45'
)

上記の例を使用して[1] =>、最初の配列の2番目のタイムスロット(提案された会議)との衝突が[2] =>あり、2番目の配列の3番目のタイムスロット(現在の会議)と衝突していることを確認します。

タイムスタンプと完全な日付の例を見てきましたが、日と開始/終了時間だけではありません。

4

3 に答える 3

2

それらがすべてデータベースにある場合、競合のクエリは次のようになります。

SELECT `plan`.*
FROM `plan`
    JOIN `current` ON `plan`.`day`=`current`.`day`
WHERE
    `plan`.`start_time` < `current`.`end_time`
    AND `plan`.`end_time` > `current`.`start_time`

ここcurrentで、は現在のスケジュールplanのテーブルであり、はユーザーのスケジュールのテーブルです。例がないという理由だけでこれをテストしていませんが、これにより、日が同じでplan時刻が重複する行が返されるはずcurrentです。

編集:current必要がない場合は、暫定的なものとしてマークするなどのことも行うことができます。これをquerywhere句に入れることができます。

また、><は、開始分と終了分が含まれないことを意味します。したがって、あるものが別の開始と同時に終了した場合、これはそれらを競合としてフラグ付けしません。>=開始/終了分を包括的にする場合は、とに変更します<=

于 2012-05-08T00:13:06.703 に答える
2

あなたはこのようにそれを行うことができます

$slot1 = Array (
        0 => array (
                'day' => 'Thursday',
                'start_time' => '14:00',
                'end_time' => '15:00' 
        ),
        1 => array (
                'day' => 'Thursday',
                'start_time' => '16:30',
                'end_time' => '17:30' 
        ) 
);

$slot2 = Array (
        0 => array (
                'day' => 'Monday',
                'start_time' => '09:00',
                'end_time' => '13:00' 
        ),
        1 => array (
                'day' => 'Wednesday',
                'start_time' => '10:45',
                'end_time' => '11:15' 
        ),
        2 => array (
                'day' => 'Thursday',
                'start_time' => '16:45',
                'end_time' => '17:45' 
        ) 
);

echo "<pre>";
$format = "l H:s";
foreach($slot1 as $value)
{
    $slot1Start = DateTime::createFromFormat ($format , $value ['day'] . " " . $value['start_time'] );
    $slot1End = DateTime::createFromFormat ( $format , $value ['day'] . " " . $value['end_time'] );

    foreach($slot2 as $value2)
    {
        $slot2Start = DateTime::createFromFormat ( $format , $value2 ['day'] . " " .$value2['start_time'] );
        $slot2End = DateTime::createFromFormat ( $format , $value2 ['day'] . " " .$value2 ['end_time'] );


        if ($slot1Start <= $slot2End && $slot1End >= $slot2Start) {
            echo sprintf ( "Even Overlap on %s %s-%s AND %s %s-%s", $value ['day'], $value ['start_time'], $value ['end_time'],
                    $value2 ['day'], $value2 ['start_time'], $value2 ['end_time'] ), PHP_EOL;
        }

    }
}

出力

Even Overlap on Thursday 16:30-17:30 AND Thursday 16:45-17:45
于 2012-05-08T00:20:13.653 に答える
0

少し変更された配列コードがあります

   $current_sheduler = Array (
        [0] =>
            day => 'Thursday',
            start_time => '14:00',
            end_time => '15:00'
        [1] =>
            day => 'Thursday',
            start_time => '16:30',
            end_time => '17:30'
    )

    $user_plans = Array (
        [0] =>
            plan_name => 'event1',
            day => 'Monday',
            start_time => '09:00',
            end_time => '13:00'
        [1] =>
            plan_name => 'event2',
            day => 'Wednesday',
            start_time => '10:45',
            end_time => '11:15'
        [2] =>
            plan_name => 'event3',
            day => 'Thursday',
            start_time => '16:45',
            end_time => '17:45'
    )

これが配列を処理し、ユーザーによって計画されたイベントが最初の配列からの時間と一致するかどうかをキャッチする方法です

foreach($user_plans as $plan){
  foreach($current_sheduler as current){
     if($plan['day']==$current['day']){
       if(
         ($plan['start_time']>=$current['start_time']) &&
         ($plan['end_time']<=$current['end_time'])
       ){
          echo "Event {$plan['plan_name']} is working now!";
       }
     }
  }
}

これは、一致が全期間の一致のみを意味する場合の一般的なロジックです。

別の注意:時間を比較する前に、カウントされた分形式に再カウントする必要があります。

于 2012-05-07T23:28:45.957 に答える