根据时间戳按日期和时间分组条目
我正在构建预订系统,并选择使用时间戳将预订存储在我的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++;
}
假设每次将它们加载到数组中时都有单独的字段,则使用第一个字符串并计数以查找最后一个字符串。
但是,是作为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'
或者我完全误解了你想要做的事情?
感谢Stephen的回复。恐怕问题并不那么简单。考虑预订表中的第四个条目,与前面的3个条目完全分开(95 96和97),尽管前三个条目是系列的一部分(您可以看到预订ID 95的bookingUntil(1317364199)后面是1317364200来自bookingID 96.但是,如果有第四条记录,那么在今天晚些时候有一个完全不同的预订 - 下午4点说,它不适用于您的解决方案,因为它会显示从上午8点到下午4点的预订,其中它应该是8-9:30,然后是4-4:30 – Amo
所以我们只在分组匹配的情况下进行分组。 例如9-10和10-11按照它们的接触分组,但9-10和2-10分组, 3不应该 (http://www.php.net/manual/en/function.sort.php) 但是,因为我们在一个多维数组中,我们可能需要一个函数来洗牌他们全部进入2个数组(开始和结束)然后排序它们。 稍后我会给它一个破解......午餐休息时间结束。 – Stephen
我觉得我的做法是选择一个给定用户的所有预订,但为了通过启动时间的结果。我觉得你现在的循环有一个正确的开始,你只需要更多的条件来确保插槽的正常工作。
我将与所述第一时隙开始,并保持调节的结束时间直到我到达的开始时间比当前的结束时间大。此时您完成当前插槽(将其推入另一个阵列),并将当前插槽设置为新插槽。
下面是一个例子,虽然我没有测试它,我认为它应该工作时间:
$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
时间戳(显然)。
作为一个方面说明,在你当前的实现中,你要小心修改foreach循环在循环运行时迭代的数组。如果你删除了一个循环尚未达到的索引,你可能会遇到各种疯狂的东西。 – phindmarsh
谢谢你,是的,我后来想到了这个,我把数据追加到一个新的数组中,这个数组在迭代的foreach循环之外定义和修改。这样我可以在迭代完成后对其进行排序和修改,而不必担心任何恶心。 – Amo
把表模式和数据的一些想法和你需要从查询中得到什么结果。 – rahularyansharma
更新了最初的帖子,谢谢! – Amo