Существуют сервисы бронирования отелей, такие как Booking, Kayak, Ostrovok. Каждый из них имеет какую-то комиссию и политику ценообразования. В течение этой задачи нам предстоит реализовать API, работающее с этими сервисами и поиск самого выгодного предложения из них. Наш сервис должен показывать честную цену, с учетом всех комиссий и преобразований. Валюта отображения – рубли.
Политика ценообразования для сервисов:
Все совпадения случайны
- Ostrovok: цену нужно увеличивать на налог 12%, платится за каждое бронирование
- Booking: цену нужно преобразовывать из долларов в рубли по курсу 1:75
- Kayak: никаких изменений, показывают конечную и удобную цену для нас
Описание отеля в каждом сервисе выглядит одинаково:
<?php
// cost будет разный в зависимости от сервиса и его политики ценообразования
// именно это число нужно "нормализовывать" для сравнения
$hotel = [ 'name' => 'hexletInn', 'cost' => 600 ];
src/Gateway.php
Реализуйте функцию findAll()
, обрабатывающую данные от разных сервисов бронирования. Он должен устанавливать для каждого цену, с учётом коэффициента этого сервиса. Сервис возвращает массив отелей и сервисов, попавших в условие. Данные для обработки находятся в массиве $hotelsByService
.
<?php
// Цены на отели возвращаются уже в нормализованном виде
// возвращается массив отелей объединенных с именем сервиса из которого они извлекаются
$hotelInfos = findAll();
// [
// ['hotel' => ['cost' => 224, 'name' => 'volga'], 'service' => 'ostrovok'],
// ['hotel' => ['cost' => 500, 'name' => 'hexletInn'], 'service' => 'booking']
// ]
Шлюз поддерживает фильтрацию по минимальной и максимальной цене:
<?php
// По умолчанию min и max не заданы, но их можно указать
findAll(['min' => 200, 'max' => 300]);
// Можно указывать только один предикат
findAll(['max' => 500]);
findAll(['min' => 100]);
src/Solution.php
Реализуйте логику функции findTheCheapestService()
, работающей со шлюзом таким образом, чтобы она принимала от пользователя диапазон цен, обращалась к сервису и выбирала из него наиболее выгодное предложение:
<?php
findTheCheapestService(['min' => 200, 'max' => 300]);
// ['hotel' => ['cost' => 224, 'name' => 'volga'], 'service' => 'ostrovok']
Подсказки
- В решении учителя нет ни одной условной конструкции
Для полного доступа к испытанию нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Отзывы

Как чувствовал что нужен collect :) Задания из этого курса все очень понравились. Решил как мне кажется не по заветам, но получилось не так многословно как у преподавателя. С будильником же наоборот, наворотил столько лишнего, что страшно смотреть :) Спасибо за интересный курс!