2011-09-30 175 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