На заднем плане запускается скрипт, который проверяет, доступен ли кто-то. Затем этот скрипт вставляет значение в базу данных. У меня нет контроля над этим сценарием. Вывод следующий:
12:01:00
12:02:00
12:03:00
12:10:00
12:11:00
12:12:00
12:13:00
12:14:00
12:15:00
так далее
Теперь мне нужно сгруппировать эти данные с помощью PHP, чтобы я получил первые и последние данные последовательных строк. Так что в этом случае мне нужны следующие данные:
12:01:00
12:03:00
12:10:00
12:15:00
Я искал этот форум и Google, но, возможно, мой английский недостаточно хорош, чтобы найти ответ. Я пробовал разные идеи (например, сравнивая время с предыдущим временем, но каждый раз, когда я получал неожиданные или не работающие результаты).
Когда вы используете mtkime () и date (), вы должны вызывать
date_default_timezone_set('UTC');
Ниже приведен пример кода. Данные хранятся в массиве в виде строк.
date_default_timezone_set('UTC');
$arr = array(
'12:01:00',
'12:02:00',
'12:03:00',
'12:10:00',
'12:11:00',
'12:12:00',
'12:13:00',
'12:14:00',
'12:15:00'
);
// Start of code sample
$firsttime = true;
$start_time = '';
$end_time = '';
foreach ($arr as $time) {
if ($firsttime === true) { // start of a new time range
// above test can be changed to $start_time === '' && $end_time === ''
$firsttime = false;
$start_time = $time;
$end_time = $time;
} else {
$diff = diff_time($end_time, $time);
// insert error check here
if ($diff <= '00:01:00') { // consecutive
$end_time = $time; // update end of the time range
} else { // end of the time range
echo $start_time, '<br />';
echo $end_time, '<br />';
$start_time = $time;
$end_time = $time;
}
}
}
if ($start_time !== '' && $end_time !== '') {
echo $start_time, '<br />';
echo $end_time, '<br />';
}
echo 'End<hr />';
function diff_time($from_time, $to_time) {
if (preg_match('/([0-9]+):([0-9]+):([0-9]+)/', $from_time, $captured)) {
$from = mktime($captured[1], $captured[2], $captured[3], 1, 1, 2000);
} else {
return false;
}
if (preg_match('/([0-9]+):([0-9]+):([0-9]+)/', $to_time, $captured)) {
$to = mktime($captured[1], $captured[2], $captured[3], 1, 1, 2000);
} else {
return false;
}
if ($from > $to) {
return date('-H:i:s', $from - $to);
} else {
return date('H:i:s', $to - $from);
}
Других решений пока нет …