我正在建立一个预订系统,并选择使用时间戳将预订存储在我的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++;
}
答案 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可能不一定反映原始的from
和until
时间戳(显然)。