我有两个员工,他们周一在两个时区工作。我想为我们的客户提供一种简单的方法来创建按一天中的不同部分(晚上、下午、上午)进行的预约。
- Morning: 0001 to 1200
- Afternoon: 1201 to 1600
- Evening: 1601 to 2400
周一到周五的日程安排
约翰上班时间:上午7点至下午1点
Michael工作时间:下午1点至7点
周六的日程表
约翰上班时间:上午8点至下午12点
星期一到星期五应该显示:上午、下午和晚上的按钮。星期六应该只显示“早上”按钮。
我不知道该怎么做,因为约翰的日程安排下午就结束了。因此,我正在研究如何检查一个时间范围是否在另一个时间范围内,并返回一个布尔值或其他值。
我试着把每件事都分成开始和结束时间块,我成功地做到了。然而,当需要将它们与一天中的时间(晚上、下午、早上)进行比较时,我不知道如何比较它们。
我不想让你们帮我写代码,我需要逻辑上的帮助。正如你从屏幕截图中看到的,除了这个小而大的部分之外,所有的东西都已经写好了。任何想法都将不胜感激!
解决方案
我使用的是Laravel php框架的ORM,叫做Eloquent。<3 *注:范围(1201,1600,5)会把事情搞得一团糟,而范围(1200,1600)会导致巨大的内存消耗,所以我增加了5。
$day_segments = array(
"morning" => range(0, 1200, 5),
"afternoon" => range(1200, 1600, 5),
"evening" => range(1600, 2400, 5)
);
// On what days of the week are users working and in what time ranges?
$user_timeranges = array();
foreach ($record->users()->get() as $user) {
foreach ($user->timeblocks as $timeblock) {
$start_range = date('Hi', strtotime("{$timeblock->start_hour} {$timeblock->start_divide}"));
$end_range = date('Hi', strtotime("{$timeblock->end_hour} {$timeblock->end_divide}"));
$user_timeranges[$timeblock->day][] = range($start_range, $end_range, 5);
}
}
// On each day what day segments are available to create appointments?
$available_segments = array();
foreach ($days_available as $day) {
$available_segments[$day] = array();
foreach ($day_segments as $name => $segment) {
$available_segments[$day][$name] = 0;
foreach ($user_timeranges[$day] as $timerange) {
if (array_intersect($segment, $timerange)) {
$available_segments[$day][$name]++;
}
}
}
}
vardump($available_segments);
exit;
发布于 2012-12-18 00:44:23
由于您似乎只完成了整个小时的工作,因此可以使用range()
函数定义每个段,对每个worker也是如此。然后使用array_intersect
,看看是否能得到令人满意的结果。
示例:
$times = Array("morning"=>range(0,12),"afternoon"=>range(12,16),"evening"=>range(16,24));
$people = Array("John"=>range(7,13),"Michael"=>range(13,19));
$available = Array();
foreach($times as $k=>$v) {
$available[$k] = 0;
foreach($people as $name=>$times) {
if( array_intersect($v,$times)) $available[$k]++;
}
}
var_dump($available);
https://stackoverflow.com/questions/13918201
复制相似问题