Как можно оптимизировать данное полотно из if?
Моё почтение! Есть вот такой код в работе, который надо оптимизировать. Сумма расчёта. Логика работы у него следующая. Заполняется форма в поп-ап окне. Отправляется на сервер, делается расчёт, выводится сумма с двумя кнопками. В скрипте две функции. Одна делает расчёт по будням, вторая с пятницы по воскресенье. Стоимость суммы фиксированная. Базы данных не имеется. Сугубо хардкод. Собственно, как это дело можно оптимизировать и сократить кол-во строк в коде?
<form action="calc.php" method="post"> <label for="adultWithChild"> <p> Взрослые, дети с 14 лет: <input type="text" name="adultWithChild" id="adultWithChild"> чел. </p> </label> <label for="kids"> <p> Дети с 6 до 13 лет: <input type="text" name="social" id="kids"> чел. </p> </label> <label for="socialGroup"> <p> Пенсионеры, инвалиды, Ветераны боевых действий: <input type="text" name="socialGroup" id="socialGroup"> </p> </label> <div class="hour"> "Время пребывания в комплексе:" <p> <input type="radio" name="time" id="r1" value="1"> 1 час </p> <p> <input type="radio" name="time" id="r2" value="2"> 2 часа </p> <p> <input type="radio" name="time" id="r3" value="3"> 4 часа <p> <input type="radio" name="time" id="r4" value="4"> Безлимит </p> </div> <br> <div class="day"> <p> <input type="radio" name="weekday" id="d1" value="1"> Понедельник - Четверг <p> <p> <input type="radio" name="dayOff" id="d5" value="2"> Пятница - Воскресенье (Праздничные) </p> </div> <input type="submit" value="Рассчитать стоимость"> </form> |
<form action="calc.php" method="post"> <label for="adultWithChild"> <p> Взрослые, дети с 14 лет: <input type="text" name="adultWithChild" id="adultWithChild"> чел. </p> </label> <label for="kids"> <p> Дети с 6 до 13 лет: <input type="text" name="social" id="kids"> чел. </p> </label> <label for="socialGroup"> <p> Пенсионеры, инвалиды, Ветераны боевых действий: <input type="text" name="socialGroup" id="socialGroup"> </p> </label> <div class="hour"> "Время пребывания в комплексе:" <p> <input type="radio" name="time" id="r1" value="1"> 1 час </p> <p> <input type="radio" name="time" id="r2" value="2"> 2 часа </p> <p> <input type="radio" name="time" id="r3" value="3"> 4 часа <p> <input type="radio" name="time" id="r4" value="4"> Безлимит </p> </div> <br> <div class="day"> <p> <input type="radio" name="weekday" id="d1" value="1"> Понедельник - Четверг <p> <p> <input type="radio" name="dayOff" id="d5" value="2"> Пятница - Воскресенье (Праздничные) </p> </div> <input type="submit" value="Рассчитать стоимость"> </form>
Дополнительно:
сколько раз выводятся ссылки позвонить/уточнить?)
Достаточно повесить обработчики на все эти инпуты, собрать в одну формулу и пару массивов весь расчет - и пересчитывать результат мгновенно при любом изменении формы.
Делаете массив, в котором индексом будут значения 1-3 (или какие там еще варианты могут быть у $data['time']), а значением - то что надо вывести. И потом просто достаете что вам нужно по индексу
Ответы:
Пара забавных фактов:
1. isset() проверяет существование переменной и возвращает true или false.
2. == - не строгое сравнение
В результате условия
if (isset($data['time']) == 2) {}
и
if (isset($data['time']) == 3) {}
Выполнятся оба, независимо от того что там в переменной $data['time']. Или не выполнятся, если ее вообще нет.
Проверим?
То есть у вас вопрос не как сократить, а понять для начала чего вы хотите добиться, а потом уже писать код. С нуля.
Возможно стоит один раз написать формулу расчета, и один массив с коэфициентами (множителями), которые подставляются в формулу в зависимости от выбранной длительности сеанса.
- Принял во внимание ваши замечания
Вынесите отдельные алгоритмы расчета и через стратегии вызывайте в соответствии с заданной логикой.
Группировать только в массив плохая идея для будущего кода - как только бизнес захочет усложнить условия (выделить разные алгоритмы для разного числа детей) - вся абстракция с массивом внутри начнет обрастать костылями.
- А, там вообще логика и представление в куче. Плевать тогда.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для оптимизации данного блока кода из множества условных операторов if можно воспользоваться конструкцией switch-case, которая делает код более читаемым и удобным для поддержки.
Пример оптимизированного кода с использованием switch-case:
switch ($variable) { case 'value1': // код для случая, когда $variable равен 'value1' break; case 'value2': // код для случая, когда $variable равен 'value2' break; case 'value3': // код для случая, когда $variable равен 'value3' break; default: // код, который выполняется, если $variable не равен ни одному из значений 'value1', 'value2', 'value3' break; }
Таким образом, использование switch-case позволяет заменить множество if-else операторов более компактной и структурированной конструкцией, что повышает читаемость кода и упрощает его поддержку.