Как правило создать обрабатывать массивы с интервалами?

У меня есть документ с ценами для мероприятия, вид примерно такой:

1 ряд: [10-21] места - 1 000 руб
2 ряд: [30-41] места - 1000 руб

1 ряд: [1-9] места - 900 руб
2 ряд: [1-29] места - 900 руб


То есть указывается Ряд, Определенный интервал мест и цена.

Я хочу написать функцию, которая будет срабатывать при добавлении билета, в нее будет передаваться ряд и номер места. Но как правильно организовать массив с интервалами, чтобы проверять, попадает ли туда номер места, которое выбрал пользователь? Насколько я знаю в JS нет что-то подобного как есть в PHP: range(). Порывшись на стековерфлоу, читаю, что нужно писать еще функцию , пусть будет так же range(1,20), которая будет тебе генерировать массив. Но проблема в том, что таких мест у меня 6 000.

Как вообще можно решить такую задачу? Мне кажется, что проверять наличие места в массиве из 2к значений - долго. Как вариант - использовать JSON-файл со схемой Сектор->Ряд->Место->Цена. Но тут тоже придется делать выборку, однако сгенерировать такой файл можно на том же PHP за десяток строчек кода. Какой выбор оптимальнее?
  • Вопрос задан
  • 303 просмотра
Решения вопроса 3
@dimentimor
В одном из проектов была схожая задача.
Цена на услугу определялась так-же временем суток. На странице заказа должно было быть вот так:

94df2cf3b5b145d7894648ff6eb62732.jpg

Заполнять руками все времена для нескольких квестов на месяц вперед- АД!
Более менее удобным оказалось вот так:

599d415f563147138fae4698ec18ee4f.jpg

Кликаем на нужные времена, выбираем ценовую группу, и добавляется новый блок (несколько времен или в вашем случае мест в зале, группируются по цене).
Этот же интерфейс может показывать свободные и занятые места. И оформлять "заказ" по клику на приглядевшееся место.

Я бы сделал несколько групп мест. У каждой группы свой набор параметров.
"Карту" мест хранил бы как матрицу с номерами групп.
// 1 - дорогие места,  2 - норм, 3 - ничего не видно
var area = [
     [2, 1, 1, 2],
  [3, 2, 1, 1, 2, 3],
     [3, 2, 2, 3],
];
// теперь нам известно, какое место, какой ряд, сколько стоит.


При оформлении заказа можно нужный элемент матрицы заменять на id заказа.
Тогда очень легко будет вывести только свободные места, только свободные конкретной группы, только 3 свободных подряд, короче любые варианты. А если место занято, то тут-же можно получить данные заказа по id.
Ответ написан
Комментировать
NeiroNx
@NeiroNx
Программист
Я бы сделал через JSON - так и так нужен 2 мерный массив.
Главное не забуть проверку на стороне сервера - а то купит кто-нибудь билетик со "скидкой".
Ответ написан
Комментировать
@Fortop
Tech/Team lead
Но как правильно организовать массив с интервалами, чтобы проверять, попадает ли туда номер места, которое выбрал пользователь?

Правильный ответ не организовывать массив с интервалами, а хранить по элементно, указав для каждого места цену.
т.е. при добавлении интервала сразу добавлять все места как отдельный элемент массива.

Проверять наличие элемента в массиве по ключу, даже если это будет не 6000, а 60000 операция не затратная

P.S. Если уж так сильно нравится php, то ничто вас не ограничивает
locutus.io/php пользуйтесь его функциями и в js
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы