2011-09-30 165 views
1

我正在構建預訂系統,並選擇使用時間戳將預訂存儲在我的mysql數據庫中。然而,用戶可以預約2或3個插槽,例如:根據時間戳按日期和時間分組條目

9:00 - 9:30 
9:30 - 10:00 
10:00 - 10:30 

或者他們可以只預訂單個插槽。

我想告訴用戶,但其中通過組的時限作出的預訂,因此,例如在它上面顯示的時間應顯示9:00 - 10:30,而不是列出3項。

每個預訂存儲有bookingFrom和bookingUntil作爲timetamp。我已經設法讓它工作2次預訂(例如9:00-9:30和9:30-10:00只顯示爲9:00-10:00),但如果有中間入口,我是在如何使這項工作中掙扎。

任何想法?我使用PHP/MySQL的

表模式

bookingID,用戶ID,bookingFrom(INT - UNIX時間戳),bookingUntil(INT - UNIX時間戳)

CREATE TABLE IF NOT EXISTS `dma_bookings` (
    `bookingID` int(11) NOT NULL AUTO_INCREMENT, 
    `userID` int(11) NOT NULL, 
    `bookingFrom` int(11) NOT NULL, 
    `bookingUntil` int(11) NOT NULL, 
    `roomID` int(11) NOT NULL, 
    PRIMARY KEY (`bookingID`), 
    KEY `userID` (`userID`,`bookingFrom`,`bookingUntil`), 
    KEY `roomID` (`roomID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=98 ; 

-- 
-- Dumping data for table `dma_bookings` 
-- 

INSERT INTO `dma_bookings` (`bookingID`, `userID`, `bookingFrom`, `bookingUntil`, `roomID`) VALUES 
(95, 1, 1317362400, 1317364199, 1), 
(96, 1, 1317364200, 1317365999, 1), 
(97, 1, 1317366000, 1317367799, 1); 

到目前爲止的代碼(道歉很凌亂!):

$bookingArray = $data['bookingInfo']; 
     $bookingCleanArray = array(); 
     $reversedArray = array_reverse($data['bookingInfo']); 
     $currentItemIndex=0; 
     $nextItemIndex=1; 

     foreach($reversedArray as $booking){ 
      echo "<hr>BookingID: ".$booking['bookingID']."<br/><br/>"; 

      $bookingFromMinusOne=$booking['bookingFrom']-1; 

      if($bookingFromMinusOne==$data['bookingInfo'][$nextItemIndex]['bookingUntil']){ 

       //The current booking is part of a multiple booking range 
       $bookingArray[$nextItemIndex]['bookingUntil']=$booking['bookingUntil']; 
       unset($bookingArray[$currentItemIndex]); 
      }else{ 
       echo "Single booking<br/>"; 
      } 

      $currentItemIndex++; 
      $nextItemIndex++; 

     } 
+1

把表模式和數據的一些想法和你需要從查詢中得到什麼結果。 – rahularyansharma

+0

更新了最初的帖子,謝謝! – Amo

回答

0

假設每次將它們加載到數組中時都有單獨的字段,則使用第一個字符串並計數以查找最後一個字符串。

但是,是作爲rahularyansharma說需要更多的細節。

好了... HHMM 難道你不只是要搶:

SELECT dma_bookings (bookingID, userID, bookingFrom, bookingUntil, roomID) WHERE userID = 1) 

這應該給我們:

bookingID,用戶ID,bookingFrom,bookingUntil,roomID

$bookingArray = array(95, 1, 1317362400, 1317364199, 1), 
array(96, 1, 1317364200, 1317365999, 1), 
array(97, 1, 1317366000, 1317367799, 1), 

所以如果我們...

echo $bookingArray[][2]; we get '1317362400' 
$c = count($bookingArray); 
echo $bookingArray[$c][3]; we get '1317367799' 

或者我完全誤解了你想要做的事情?

+0

感謝Stephen的回覆。恐怕問題並不那麼簡單。考慮預訂表中的第四個條目,與前面的3個條目完全分開(95 96和97),儘管前三個條目是系列的一部分(您可以看到預訂ID 95的bookingUntil(1317364199)後面是1317364200來自bookingID 96.但是,如果有第四條記錄,那麼在今天晚些時候有一個完全不同的預訂 - 下午4點說,它不適用於您的解決方案,因爲它會顯示從上午8點到下午4點的預訂,其中它應該是8-9:30,然後是4-4:30 – Amo

+0

所以我們只在分組匹配的情況下進行分組。 例如9-10和10-11按照它們的接觸分組,但9-10和2-10分組, 3不應該 (http://www.php.net/manual/en/function.sort.php) 但是,因爲我們在一個多維數組中,我們可能需要一個函數來洗牌他們全部進入2個數組(開始和結束)然後排序它們。 稍後我會給它一個破解......午餐休息時間結束。 – Stephen

0

我覺得我的做法是選擇一個給定用戶的所有預訂,但爲了通過啓動時間的結果。我覺得你現在的循環有一個正確的開始,你只需要更多的條件來確保插槽的正常工作。

我將與所述第一時隙開始,並保持調節的結束時間直到我到達的開始時間比當前的結束時間大。此時您完成當前插槽(將其推入另一個陣列),並將當前插槽設置爲新插槽。

下面是一個例子,雖然我沒有測試它,我認爲它應該工作時間:

$slots = array(
    array('bookingID' => 95, 'userID' => 1, 'bookingFrom' => 1317362400, 'bookingUntil' => 1317364199, 'roomID' => 1), 
    array('bookingID' => 96, 'userID' => 1, 'bookingFrom' => 1317364200, 'bookingUntil' => 1317365999, 'roomID' => 1), 
    array('bookingID' => 97, 'userID' => 1, 'bookingFrom' => 1317366000, 'bookingUntil' => 1317367799, 'roomID' => 1) 
); 

$condensed_slots = array(); 
$currentSlot = null; 
foreach($slots as $slot){ 
    if($currentSlot == null) $currentSlot = $slot; 
    else { 
     if($slot['bookingFrom'] <= $currentSlot['bookingUntil']){ 
      $currentSlot['bookingUntil'] = $slot['bookingFrom']; 
     } 
     else { 
      $condensed_slots[] = $currentSlot; 
      $currentSlot = $slot; 
     } 
    } 
} 

這樣$condensed_slots後應該包含一個簡化的集合(如果可能)插槽,雖然bookingID可能不一定反映原始的fromuntil時間戳(顯然)。

+0

作爲一個方面說明,在你當前的實現中,你要小心修改foreach循環在循環運行時迭代的數組。如果你刪除了一個循環尚未達到的索引,你可能會遇到各種瘋狂的東西。 – phindmarsh

+0

謝謝你,是的,我後來想到了這個,我把數據追加到一個新的數組中,這個數組在迭代的foreach循環之外定義和修改。這樣我可以在迭代完成後對其進行排序和修改,而不必擔心任何噁心。 – Amo