我有很多日期需要检查。
例如:
1 - Start: 1387267200, End: 1387274400
2 - Start: 1387270800, End: 1387275000
3 - Start: 1387250200, End: 1387273000
4 - Start: 1387285200, End: 1387288800
我需要的是计算foreach与最小开始日期和最长结束日期的重叠。
对于上面的例子,algor必须在输出中给出的是:
Start1: 1387250200 -> End1: 1387275000.
Start2: 1387285200 -> End2: 1387288800.
我该怎么做?
谢谢!
答案 0 :(得分:2)
此脚本查找重叠的间隔,并获取具有最小开始日期和最长结束日期的新间隔:
// 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
)
)
答案 1 :(得分:0)
对数组中的所有开始和结束时间进行排序。
i = 0;
和count = 0;
(计数跟踪活动间隔的数量)i'th
重叠的开始时间。另外,递增计数器count
。 count
。如果count
变为零,请将此注释为ith
间隔的结束时间并增加i
。