php – 议程中可用时间的算法
发布时间:2020-12-13 16:48:40 所属栏目:PHP教程 来源:网络整理
导读:我真的陷入了这种境地. 我有这两个表: employee_working_schedule(存储员工在特定日期工作的开始和结束时间) employee_appointments 假设我们存储了那些行 employee_working_schedule: start | end10:00 | 18:00 employee_appointments: start | end10:10
我真的陷入了这种境地.
我有这两个表: > employee_working_schedule(存储员工在特定日期工作的开始和结束时间) 假设我们存储了那些行 employee_working_schedule: start | end 10:00 | 18:00 employee_appointments: start | end 10:10 | 11:00 11:20 | 12:00 14:30 | 15:20 在这种情况下,我想表明可用时间是: 10:00 | 10:10 11:00 | 11:20 12:00 | 14:30 15:20 | 18:00 有没有办法通过SQL执行此操作?我试图用PHP实现,但到目前为止没有成功. 任何帮助将不胜感激. 解决方法
这是一种在纯PHP中执行此操作的方法:
class TimeSpan { function __construct($start,$end) { $this->start = $start; $this->end = $end; } function starttime() { list($hour,$minute) = explode(":",$this->start); return (int)$hour * 60 + (int)$minute; } function endtime() { list($hour,$this->end); return (int)$hour * 60 + (int)$minute; } } function convert_to_time($minutes) { $hour = (int) ($minutes / 60); $minutes = $minutes % 60; return str_pad($hour,2,'0',STR_PAD_LEFT) . ':' . str_pad($minutes,STR_PAD_LEFT); } function open_times($shift,$appointments) { $alltimes = array_fill_keys(range($shift->starttime(),$shift->endtime()),1); foreach ($appointments as $appt) { $alltimes = array_diff_key($alltimes,array_fill_keys(range($appt->starttime() + 1,$appt->endtime() - 1),1)); } $groups = array(); $active_group = 0; $output = array(); $output_counter = 0; $nums = array_keys($alltimes); foreach( $nums as $k => $num ) { if( $k !== 0 && $nums[$k] !== $nums[$k-1]+1 ) $active_group ++; $groups[ $active_group ][] = $num; } foreach( $groups as $group ) { $first = array_shift( array_values($group) ); $output[$output_counter][] = $first; $last = array_pop( array_values($group) ); if( $first !== $last ) $output[$output_counter][] = $last; $output_counter++; } foreach ($output as &$span) { $span[0] = convert_to_time($span[0]); $span[1] = convert_to_time($span[1]); } return $output; } $shift = new TimeSpan("10:00","18:00"); $appointments = array( new TimeSpan("10:10","11:00"),new TimeSpan("11:20","12:00"),new TimeSpan("14:30","15:20"),); print_r(open_times($shift,$appointments)); OUTPUT Array ( [0] => Array ( [0] => 10:00 [1] => 10:10 ) [1] => Array ( [0] => 11:00 [1] => 11:20 ) [2] => Array ( [0] => 12:00 [1] => 14:30 ) [3] => Array ( [0] => 15:20 [1] => 18:00 ) ) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |