2011-01-07 7 views
4

두뇌가 첫 번째 기어에서 벗어나지 않는 시대를 만나요?겹치는 엔티티 배열을 기반으로 새 배열을 만듭니다.

배열에 시작 및 종료 시간이 있습니다. 초기 배열에서 겹치는 항목의 키를 보여주는 새 배열을 만들고 싶습니다. 그래서, 우리는 '예약'이 있다고 말합니다. 겹치는 '예약'은 모두 동일한 '세션'에 속합니다. 같은 초기 배열 : 큰 배열이 작업을 수행하는 가장 효율적인 방법이 될 것입니다 무엇

[sessions] => Array 
    (
     [0] => Array 
      (
       [0] => 1125 
       [1] => 1244 
       [2] => 1311 
      ) 
     [1] => Array 
      (
       [0] => 1422 
       [1] => 1561 
      ) 
     [2] => Array 
      (
       [0] => 1622 
      ) 
    ) 

:

[reservations] => Array 
    (
     [1125] => Array 
      (
       [start] => 2011-01-07 10:00:00 
       [end] => 2011-01-07 10:30:00 
      ) 
     [1244] => Array 
      (
       [start] => 2011-01-07 10:15:00 
       [end] => 2011-01-07 11:30:00 
      ) 
     [1311] => Array 
      (
       [start] => 2011-01-07 11:00:00 
       [end] => 2011-01-07 11:45:00 
      ) 
     [1422] => Array 
      (
       [start] => 2011-01-07 12:00:00 
       [end] => 2011-01-07 12:30:00 
      ) 
     [1561] => Array 
      (
       [start] => 2011-01-07 12:30:00 
       [end] => 2011-01-07 12:45:00 
      ) 
     [1622] => Array 
      (
       [start] => 2011-01-07 13:00:00 
       [end] => 2011-01-07 13:45:00 
      ) 
    ) 

같은 새로운 배열을 생성하는 것? 감사!

+0

나는 실제로 당신이 : 난 당신이 추적해야한다라고 말하고 싶지만 해결해야한다는 것을 조금 질투 각 세션의 시작 시간 및 종료 시간, 그리고 세션이 속한 각 예약 검사에 대한 정보를 제공합니다. 세션에 속한 경우 시작 및/또는 종료 시간을 업데이트하십시오. 그렇지 않은 경우 새 세션을 만듭니다. 둘 이상의 세션에 속한 경우 세션을 병합하십시오. 해피 코딩! –

+0

* "중복되는 '예약'은 모두 동일한 '세션'에 속합니다."* - 100 % 명확하지 않습니다. 모든 예약이 쌍으로 겹쳐 야합니까? 10 : 00-11 : 00,10 : 30-11 : 30 및 11 : 15-12 : 00이 세션을 형성합니까? 마지막 세션은 첫 번째 세션과 겹치지 않습니까? –

+0

감사합니다. Rafal -이 예에서 예, 위의 3 가지 예약은 처음 예약과 마지막 예약이 중간 예약과 교차하므로 실제로 예제 배열이 맘에 들었습니다. 마찬가지로 예약이 12시 30 분에 종료되고 다른 예약이 12시 30 분에 시작되면 중복도 고려할 수 있습니다. – boatingcow

답변

3

예약 할 때마다 (시작, ID) 및 (종료, ID) (개별적으로) 첫 번째 항목 (즉 시간)으로 정렬 된 튜플의 배열에 넣습니다. 그런 다음 배열을 가장 낮은 시간에서 가장 높은 순서로 어떤 예약이 열려 있는지, 동일한 세션에 모든 새로운 예약을 넣는 지 여부. 세션의 마지막 예약이 닫히면 세션을 닫습니다. 따라서

+0

정확히 설명 할 해결책이 있습니다. ;-) – Simon

+0

나는 이것을 우리가 사용했던 것과 가장 가까운 것으로 대답으로 표시했습니다! – boatingcow

0

진짜 코드와 테스트,하지만 방법이 될 수 없습니다 :

foreach([reservations] as $key => $res){ 
    $a[ timestamp_of($res[start]) ] = $key; 
    $a[ timestamp_of($res[end]) ] = $key; 
} 

ksort($a, SORT_NUMERIC); //sort by timestamp 

$open = Array(); //currently 'open' reservations while looping through 
$sesions = Array(); //result array for sessions 
$active = 0; //ID of active session 

foreach($a as $item){ 
    if($item in $open) { //check if current reservation is in list of open ones 

     strip($item, $open); //if so: close it → remove from array 
     if(sizeof($open) == 0) $active++; //if no reservations open, close the session 

    } else {  //if current reservation is not open... 

     $open[$item] = true; //open it 
     $sessions[$active][] = $item //and add it to current session 

    } 
} 
+0

Rafał의 크레딧 또한 – Simon

+0

'ksort ($ a, SORT_NUMERIC)'입니다. 'asort'는 키를 보존하는 값에 의해 정렬되고,'ksort'는 키에 의해 정렬됩니다. – Thai

+0

@ 타이 - 네, 고마워요. 그것을 바 꾸었습니다! – Simon

관련 문제