powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Грамотная структура данных для хранения периодов дат
3 сообщений из 3, страница 1 из 1
Грамотная структура данных для хранения периодов дат
    #40055412
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день Уважаемые!

У меня такая задача:
Есть PHP приложение, которое запрашивает из БД несколько временных периодов типа:
Код: php
1.
2.
3.
4.
5.
[
   ['from' => '10.01.2001', 'to' => '15.01.2001'],
   ['from' => '01.03.2002', 'to' => '17.04.2002'],
   ...............................
]



И мне надо этот набор отрезков привести к какой-то структуре данных, для которой я мог-бы быстро делать проверку:
Есть ли отрезок, в который попадает указанный день.

* Делать запросами к БД не подойдёт, т.к. проверок много в каждой итерации скрипта, неправильно это дёргать в таком случае БД.
* Всякие пересечения и прочее неважны. Так что тут их не надо рассматривать.

Пока выдумал что-то типа такого:
* Берём год начала отрезка ($Y). Для каждого такого года заводим
Код: php
1.
$yData[$Y] = [];


* Берём порядковый №дня в году, начала отрезка (типа 5 ферваля это 36-ой день в году), ($NFrom)
* Берём порядковый №дня в году, конца отрезка (аналогично) ($NTo). Тут разные года начала и конца не рассматриваем. Это я учёл.
* Формируем типа такого:
Код: php
1.
$yData[$Y] = array_merge($yData[$Y], range($NFrom, $NTo, 1));

с последующим flip'ом для проверки по ключу массива.

Есть ли более грамотное решение такой задачи?
...
Рейтинг: 0 / 0
Грамотная структура данных для хранения периодов дат
    #40055423
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
$intervals = [
	['from' => '19.03.2019', 'to' => '11.04.2019'],
	['from' => '14.05.2006', 'to' => '19.10.2015'],
	['from' => '01.01.2009', 'to' => '04.02.2012'],
	['from' => '31.07.2016', 'to' => '22.08.2016'],
	['from' => '07.08.2015', 'to' => '09.12.2017'],
];

$dateToCheck = strtotime( '10.08.2016' );

$filteredIntervals = array_filter(
	$intervals, 
	function( $item ) use ( $dateToCheck ) {
		return strtotime($item['from']) <= $dateToCheck && $dateToCheck <= strtotime($item['to']);
	}
);

print_r( $filteredIntervals );
...
Рейтинг: 0 / 0
Грамотная структура данных для хранения периодов дат
    #40055449
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikkiMouse,

Красиво! Спасибо!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Грамотная структура данных для хранения периодов дат
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]