好的,我起草了这个,所以可能有些小问题。使用下面看到的数据进行测试,似乎工作得很好。可能不是最好的方法,但它是一种方法,而且确实有效。如果有问题,请让我知道。
function combineRange($array) {
if (is_array($array)) {
sort($array);
$prev = array();
$prev_key = null;
foreach ($array as $key => $item) {
if (empty($prev)) {
$prev = $item;
$prev_key = $key;
continue;
}
if ($item[0] >= $prev[0] && $item[0] <= $prev[1]) {
if ($array[$prev_key][1] < $item[1])
$array[$prev_key][1] = $item[1];
unset($array[$key]);
}else {
$prev_key = $key;
}
$prev = $item;
}
}
return $array;
}
$array = array(
5 => array(13, 16),
0 => array(1, 5),
1 => array(4, 8),
2 => array(19, 24),
3 => array(6, 9),
4 => array(11, 17),
6 => array(21, 30),
);
var_dump(combineRange($array));
输出:
array(3) {
[0]=>
array(2) {
[0]=>
int(1)
[1]=>
int(9)
}
[3]=>
array(2) {
[0]=>
int(11)
[1]=>
int(17)
}
[5]=>
array(2) {
[0]=>
int(19)
[1]=>
int(30)
}
}
希望它对你有用!
编辑:
看来我被一个小时击败了 =\ 哦,算了!我还是发表一下,因为这是一种不同的方法,尽管我可能会选择konforce的方法。
[1,2],[3,4]
视为一个单一的范围[1,4]
。在这种情况下,它应该是这样写的:如果(3 > 2 + 1)
,则开始一个新的范围。对于浮点数,这并不是非常有用。可以删除或将+1设置为非常小的增量(+.00001),具体取决于您认为的足够小的数字大小。 - Matthewif()
块之外,到处都要使用strtotime()
),但你为我节省了一些CPU和几行代码,并在第一个if()
块中添加了60
(即60秒)而不是1
。如果有更好的合并日期时间范围的方法,我很想看到(作为更新)(尽管我还没有绝望到发表新问题)。 - Fr0zenFyr