Php 如何计算和显示参与者可用性重叠的实际时间

Php 如何计算和显示参与者可用性重叠的实际时间,php,Php,如何计算和显示团队中参与者可用性重叠的实际时间。例如,这有3个人,他们有不同的可用性 开始时间-结束时间 [人员1]=>凌晨1:30-5:00 [人员1]=>5:00pm-11:00pm [人员2]=>12:00am-11:30am [人员3]=>凌晨2:00-晚上11:30 这是另一个数组 开始时间 Array ( [0] => Array ( [1] => 1:30am [2] => 5:00pm

如何计算和显示团队中参与者可用性重叠的实际时间。例如,这有3个人,他们有不同的可用性

开始时间-结束时间

[人员1]=>凌晨1:30-5:00

[人员1]=>5:00pm-11:00pm

[人员2]=>12:00am-11:30am

[人员3]=>凌晨2:00-晚上11:30

这是另一个数组

开始时间

Array
(
    [0] => Array
        (
            [1] => 1:30am
            [2] => 5:00pm                
        )

    [1] => Array
        (
            [1] => 12:00am                
        )

    [2] => Array
        (
            [1] => 2:00am                
        )

)
Array
(
    [0] => Array
        (
            [1] => 5:00am
            [2] => 11:00pm                
        )

    [1] => Array
        (
            [1] => 11:30am                
        )

    [2] => Array
        (
            [1] => 11:30pm                
        )

)
结束时间

Array
(
    [0] => Array
        (
            [1] => 1:30am
            [2] => 5:00pm                
        )

    [1] => Array
        (
            [1] => 12:00am                
        )

    [2] => Array
        (
            [1] => 2:00am                
        )

)
Array
(
    [0] => Array
        (
            [1] => 5:00am
            [2] => 11:00pm                
        )

    [1] => Array
        (
            [1] => 11:30am                
        )

    [2] => Array
        (
            [1] => 11:30pm                
        )

)

两个时间跨度重叠时有四种情况,可分为两种:

// As, Ae = A start, A end
// Bs, Be = B start, B end

1) A  *-----*              -.
   B      *--------*        | As <= Bs && Ae >= Bs
                            }  = A starts before B
                            |    A ends during the span of B and can extend
2) A  *---------------*    -'      beyond B
   B      *--------*


3) A       *------*        -.
   B   *-------*            | Bs <= As && Be >= As
                            }  = B starts before A 
                            |    B ends during the span of A and can extend
4) A        *------*       -'      beyond A's duration
   B  *---------------*
//As,Ae=开始,结束
//Bs,Be=B开始,B结束
1) A*----*-。
B*----------*| As=Bs
}=A在B之前开始
|A在B的跨度内结束,并可延伸
2) A*----“在B之外”
B*--------*
3) A*----。
B*----*| Bs=As
}=B在A之前开始
|B在A的跨度内结束,并可延伸
4) A*-*-'超过A的持续时间
B*---------------*
使用此信息,可以遍历明细表,比较两个明细表是否重叠,如果重叠,则计算两个明细表的交点。然后使用这个新的交叉时间作为循环中下一次比较的基础(因为您正在寻找所有可用性计划的最终交叉点)