2012-05-07 5 views
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' 
) 

가있는 경우 두 번째 슬롯에 충돌이 감지입니다 두 번째 배열 (현재 회의)의 세 번째 타임 슬롯 [2] =>과 충돌하는 첫 번째 배열 (제안 된 회의)의 [1] =>.

타임 스탬프 및 전체 날짜가 포함 된 예가 있지만 요일과 시작/종료 시간은 아닙니다.

+2

을 할 수있는 이러한 데이터베이스에 있습니까? 결과적으로 질의하고 상충되는 행만 가져 오는 것이 정말 쉽기 때문입니다. 훨씬 더 효율적입니다. –

+0

그들은 실제로 모든 현재 사용자 회의가 매일 start_time 및 end_time으로 하나의 테이블에 저장되고 새 회의가 동일한 데이터로 다른 테이블에 다시 저장됩니다.MySQL 쿼리를 사용하면 어떻게 될까요? – lethalMango

답변

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라고 표시된 것을 임시로 원할 수도 있습니다. 당신은 질의 where 절에 넣을 수 있습니다.

또한 ><은 시작 및 종료 분이 포함되지 않음을 의미합니다. 그래서 다른 하나가 시작될 때 동시에 끝나면, 충돌로 간주하지 않을 것입니다. 시작/종료 분을 포함 시키려면 >=<=으로 변경하십시오.

+0

고마워요 조나단, 지금 당장 말이야. 최종 결과는 모든 20 명의 직원 목록을 작성한 다음 계획된 시간과 충돌하는 직원 구성원 옆에 표시를하는 것입니다. 쿼리를 20 번 실행하는 유일한 방법은 없을까요? – lethalMango

+1

@ lethalMango 개별 직원에 대한 쿼리를 실행하려면 where 절에 'AND plan.staff_id = 12345'와 같은 것을 추가해야합니다. 이를 수행하거나 where 절에 해당 부분을 생략하고 모든 직원을 선택하면 결과를 반복하고 예약 된 이벤트 및 충돌을 배열 할 수 있습니다. 그런 다음 스태프를 둘러보고 스태프가 해당 이벤트의 충돌에 있는지 살펴 봅니다. 테이블 구조가 있고 원하는 출력이 있다면 더 도움이 될만한 것을 만들 수 있습니다. –

+0

나는 당신의 대답과 코멘트, 도움 덕분에 내가 원했던 모든 것을 얻을 수 있었다 :) – lethalMango

0

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!"; 
     } 
    } 
    } 
} 

이 일반적인 논리를 약간 수정 배열 코드

$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' 
    ) 
여기

이다 사용자가 계획 한 이벤트가 첫 번째 배열에서 시간을 일치하는 경우 배열과 어획량을 처리하는 방법 당신을이있다 상황에 따라 경기가 전체 기간 경기 만 의미하는 경우

다른 공지 사항 : 비교 시간은 계산 된 분 형식으로 다시 계산해야합니다.

+0

다차원 배열이기 때문에'$ current_sheduler'를 반복해야합니다. 이는 또한'count ($ current_sheduler) * count ($ user_plans)'반복 횟수가 이상적이지 않다는 것을 의미합니다. –

+0

Yah, 나는 동의한다, 2 개의 루프 네세 사라, 나의 코드를 고쳤다. 그리고 야, 이것은 가장 효과적인 해결책이 아니며 많은 반복이 필요할 것입니다. – DaneSoul

+0

또한 시간 오버랩의 모든 조합을 포함하지는 않습니다. 예 : 계획 = 10-12 및 현재 = 9-11 또는 계획 = 9-12 및 현재 = 10-11. –

1

당신은 이런 식

$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