php - 如何计算重叠的多个日期之间的日期范围

标签 php algorithm date range overlapping-matches

<分区>

我有很多日期需要检查。

例如:

1 - Start: 1387267200, End: 1387274400
2 - Start: 1387270800, End: 1387275000 
3 - Start: 1387250200, End: 1387273000 
4 - Start: 1387285200, End: 1387288800

我需要计算 foreach 重叠的最小开始日期和最大结束日期。

对于上面的例子,算法必须在输出中给出的是:

Start1: 1387250200 -> End1: 1387275000.
Start2: 1387285200 -> End2: 1387288800.

我该怎么做?

谢谢!

最佳答案

此脚本查找重叠的时间间隔并获取具有最短开始日期和最长结束日期的新时间间隔:

// Input
$intervals = array(
    array(1387267200, 1387274400),
    array(1387270800, 1387275000),
    array(1387250200, 1387273000),
    array(1387285200, 1387288800),
);
// Overlapped intervals
$overlapped = array();
foreach ($intervals as $i => $a) {
    $group = [$a];
    foreach ($intervals as $j => $b) {
        if (
            $i !== $j && (($a[0] <= $b[0] && $a[1] >= $b[0])
                || ($a[0] <= $b[1] && $a[0] >= $b[0]))
        ) {
            $group[] = $b;
        }
    }
    sort($group);
    $overlapped[] = $group;
}
// Multidimensional array_unique()
$overlapped = array_map('unserialize',
    array_unique(array_map('serialize', $overlapped))
);
// Output
$output = array();
// Get min/max dates for each overlapped group
foreach ($overlapped as $group) {
    $min = null;
    $max = null;
    foreach ($group as $interval) {
        if ($min === null || $interval[0] < $min) {
            $min = $interval[0];
        }
        if ($max === null || $interval[1] > $max) {
            $max = $interval[1];
        }
    }
    $output[] = array($min, $max);
}
print_r($output);

输出:

Array
(
    [0] => Array
        (
            [0] => 1387250200
            [1] => 1387275000
        )

    [1] => Array
        (
            [0] => 1387285200
            [1] => 1387288800
        )

)

关于php - 如何计算重叠的多个日期之间的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20660318/

相关文章:

php - 无法在 Mac 上运行 MySQL

string - 当目标是找到特定字符串的所有出现时,KMP 的最坏情况复杂度是多少?

algorithm - "2"在 0 到 n 的所有数字中出现了多少次

python - 如果日期字符串中有字符或负数,我该如何编写语句?

javascript - window.history.pushState 刷新浏览器

php - 如何从数据库中查找范围值

php - 带有乘客和 php 模块的 Apache,不执行 php

algorithm - 如果记忆化是自上而下的深度优先,而 DP 是自下而上的广度优先,那么自上而下的广度优先/自下而上的深度优先等价物是什么?

php - 在php中转换文本字符串中的日期格式

php - jquery 全日历显示第二天的事件