<?php
$data = [
['start' => 0, 'end' => 1],
['start' => 2, 'end' => 4],
['start' => 4, 'end' => 6],
['start' => 3, 'end' => 4],
['start' => 6, 'end' => 7],
['start' => 8, 'end' => 9],
['start' => 10, 'end' => 12],
['start' => 9, 'end' => 10]
];
$startTime = time();
// 排序start
$leftKeys = array_column($data, 'start');
for($i = 0; $i < count($leftKeys) - 1; $i ++) {
$smallNum = $i;
for ($j = $i + 1; $j < count($leftKeys); $j++) {
if ($leftKeys[$j] < $leftKeys[$smallNum]) $smallNum = $j;
}
if ($smallNum != $i) {
$tmp = $leftKeys[$i];
$leftKeys[$i] = $leftKeys[$smallNum];
$leftKeys[$smallNum] = $tmp;
}
}
var_dump($leftKeys);
// 按start从小到大排序所有区间
$sortList = [];
$data = array_column($data, null, 'start');
foreach ($leftKeys as $val) {
array_push($sortList, $data[$val]);
}
// 检索可用区间
$efData = [];
$lastData = $sortList[0];
foreach ($sortList as $key => $nowData) {
if ($key == 0) continue;
if ($lastData['end'] < $nowData['start']) {
array_push($efData, $lastData);
$lastData = $nowData;
continue;
}
if ($lastData['end'] >= $nowData['start'] && $lastData['end'] < $nowData['end']) {
$lastData['end'] = $nowData['end'];
if ($key == count($sortList) - 1) array_push($efData, $lastData);
continue;
}
if ($lastData['end'] >= $nowData['end']) {
if ($key == count($sortList) - 1) array_push($efData, $lastData);
continue;
}
}
$endTime = time();
echo "耗时", ($endTime - $startTime), "\n";
echo "可用结果" . "\n";
var_export($efData);
结果: