合并时间段-php

合并时间段-php,php,Php,我在每个红色标记的时段上都有信息(开始时间戳和结束时间戳) 我想要实现的是: 最后一个期间还应包含合并期间的数量,如蓝色范围所示 我试着从最小值和最大值开始每分钟迭代一次,但我想这不是解决这个问题的最佳方法。 实际上,我在这里已经没有什么想法了:( 示例数据: [0] => Array ( [start] => 2018-11-8 09:00 [startTimestamp] => 1541664000 [finish

我在每个红色标记的时段上都有信息(开始时间戳和结束时间戳)

我想要实现的是:

最后一个期间还应包含合并期间的数量,如蓝色范围所示

我试着从最小值和最大值开始每分钟迭代一次,但我想这不是解决这个问题的最佳方法。 实际上,我在这里已经没有什么想法了:( 示例数据:

[0] => Array
    (
        [start] => 2018-11-8 09:00
        [startTimestamp] => 1541664000
        [finish] => 2018-11-8 15:00
        [finishTimestamp] => 1541685600
        [machine_id] => 1
    )

[1] => Array
    (
        [start] => 2018-11-8 01:30
        [startTimestamp] => 1541637000
        [finish] => 2018-11-8 05:30
        [finishTimestamp] => 1541651400
        [machine_id] => 1
    )

[2] => Array
    (
        [start] => 2018-11-8 10:00
        [startTimestamp] => 1541667600
        [finish] => 2018-11-8 18:30
        [finishTimestamp] => 1541698200
        [machine_id] => 4
    )

[3] => Array
    (
        [start] => 2018-11-8 09:00
        [startTimestamp] => 1541664000
        [finish] => 2018-11-8 15:00
        [finishTimestamp] => 1541685600
        [machine_id] => 5
    )

[4] => Array
    (
        [start] => 2018-11-8 01:30
        [startTimestamp] => 1541637000
        [finish] => 2018-11-8 05:30
        [finishTimestamp] => 1541651400
        [machine_id] => 5
    )
感谢@solarc

        $startEndTimes = [];
    foreach ($periodsData as $periodsDatum) {
        $startEndTimes[$periodsDatum['startTimestamp']]  = date('Y-m-d H:i:s', $periodsDatum['startTimestamp']);
        $startEndTimes[$periodsDatum['finishTimestamp']] = date('Y-m-d H:i:s', $periodsDatum['finishTimestamp']);
    }

    $split = [];
    foreach ($periodsData as $periodsDatum) {
        foreach ($startEndTimes as $timestamp => $dateTime) {
            if ($timestamp < $periodsDatum['finishTimestamp'] AND $timestamp > $periodsDatum['startTimestamp']) {
                $split[] = [
                    'machine_id'      => $periodsDatum['machine_id'],
                    'startTimestamp'  => $periodsDatum['startTimestamp'],
                    'finishTimestamp' => $timestamp,
                    'start'           => $periodsDatum['start'],
                    'finish'          => date('Y-n-j H:i:s', $timestamp),
                ];
                $split[] = [
                    'machine_id'      => $periodsDatum['machine_id'],
                    'startTimestamp'  => $timestamp,
                    'finishTimestamp' => $periodsDatum['finishTimestamp'],
                    'start'           => date('Y-n-j H:i:s', $timestamp),
                    'finish'          => $periodsDatum['finish'],
                ];
            }
        }
    }
$startEndTimes=[];
foreach($periodsData作为$periodsDatum){
$startEndTimes[$periodsDatum['startTimestamp']]=日期('Y-m-d H:i:s',$periodsDatum['startTimestamp']);
$startEndTimes[$periodsDatum['finishTimestamp']]=date('Y-m-d H:i:s',$periodsDatum['finishTimestamp']);
}
$split=[];
foreach($periodsData作为$periodsDatum){
foreach($startEndTimes作为$timestamp=>$dateTime){
如果($timestamp<$periodsDatum['finishTimestamp']和$timestamp>$periodsDatum['startTimestamp'])){
$split[]=[
'machine_id'=>$periodsDatum['machine_id'],
'startTimestamp'=>$periodsDatum['startTimestamp'],
'finishTimestamp'=>$timestamp,
'start'=>$periodsDatum['start'],
'完成'=>日期('Y-n-j H:i:s',$timestamp),
];
$split[]=[
'machine_id'=>$periodsDatum['machine_id'],
'startTimestamp'=>$timestamp,
'finishTimestamp'=>$periodsDatum['finishTimestamp'],
'开始'=>日期('Y-n-j H:i:s',$timestamp),
'finish'=>$periodsDatum['finish'],
];
}
}
}
  • 制作一组所有开始和结束时间(无重复)

  • 如果集合中的某个时间在其自身的开始时间和结束时间之间,则拆分每个块(例如,从09:00到15:00的块被拆分为2:09:00到10:00和10:00到15:00):

  • 最后,计算跨列重复的块数:

        - 01:30 to 05:30 (2 times)
        - 09:00 to 10:00 (2 times)
        - 10:00 to 15:00 (4 times)
        - 15:00 to 18:30 (2 times)
    

  • 你能提供一些例子数据吗?是的,当然,我会在sec@Slay33,请提供您已经编写的代码。这真是太棒了,谢谢。为问题添加了我的代码答案。
        - 01:30 to 05:30 (col 1)
        - 09:00 to 10:00 (col 1)
        - 10:00 to 15:00 (col 1)
        - 10:00 to 15:00 (col 2)
        - 15:00 to 18:30 (col 2)
        - 01:30 to 05:30 (col 3)
        - 09:00 to 10:00 (col 3)
        - 10:00 to 15:00 (col 3)
        - 10:00 to 15:00 (col 4)
        - 15:00 to 18:30 (col 4)
    
        - 01:30 to 05:30 (2 times)
        - 09:00 to 10:00 (2 times)
        - 10:00 to 15:00 (4 times)
        - 15:00 to 18:30 (2 times)