首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并时间段- php

合并时间段- php
EN

Stack Overflow用户
提问于 2018-11-07 16:56:15
回答 1查看 118关注 0票数 1

我有信息(开始时间戳和完成时间戳)在每个红色标记的时期。

我想要做到的是:

最后一段时间还应包含合并期间的数目,如蓝跨度所示。

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

代码语言:javascript
复制
[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

代码语言:javascript
复制
        $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'],
                ];
            }
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-07 17:30:40

  1. 制作一组所有的开始和结束时间(没有重复) 01:30,05:30,09:00,10:00,14:00,18:30
  2. 如果集合中有一段时间在开始时间和结束时间之间进行拆分(例如,从09:00到15:00的块被拆分为2: 09:00到10:00和10:00到15:00):
    • 01:30至05:30 (第1组)- 09:00至10:00 (第1组)- 10:00至15:00 (第1组)- 10:00至15:00 (第2组)- 15:00至6:30(第2组)- 01:30至05:30 (第3组)- 09:00至10:00 (第3组)- 10:00至15:00 (第3组)-上午10:00至下午3:00(第4室)-下午3:00至6:30(第4室)

  3. 最后,计算跨列重复的块数:
    • 01:30至05:30 (2次)- 09:00至10:00 (2次)- 10:00至15:00 (4次)- 15:00至6:30 (2次)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53194211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档