按时间戳的日期和时间对条目进行分组

时间:2011-09-30 03:49:46

标签: php mysql date timestamp

我正在建立一个预订系统,并选择使用时间戳将预订存储在我的mysql数据库中。用户可以连续地预订2或3个插槽,例如:

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

或者他们可以预订单个插槽。

我想显示用户所做的预订,但是按时间段对它们进行分组,因此例如在上面显示的时间内,它应显示9:00 - 10:30而不是列出3项。

每个预订都存储有bookingFrom和bookingUntil作为时间戳。我已经设法让它适用于2次预订(例如9:00-9:30和9:30-10:00显示为9:00-10:00)但如果有中间入口,我是努力学习如何使这项工作。

有什么想法吗?我正在使用PHP / mySQL

TABLE SCHEMA

bookingID,userID,bookingFrom(INT - unix timestamp),bookingUntil(INT - unix timestamp)

    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++;

        }

2 个答案:

答案 0 :(得分:0)

假设每次将它们加载到数组中时都有单独的字段,那么使用第一个字符串并计数以查找最后一个字符串。

但是,正如rahularyansharma所说需要更多细节。

好的......嗯 难道你不想抓住:

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

哪个应该给我们:

bookingID,userID,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'

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

答案 1 :(得分: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时间戳(显然)。