Условие if/elseif php, как написать лучше?

214
14 февраля 2018, 12:17

Есть кусок кода написанный мною, отрабатывает правильно, вместе с тем есть ощущение что можно написать лучше, подскажите пожалуйста как написать лучше если это возможно.

if(isset($filter_status) && !isset($filter_language)){
                if($this->getMkTime($item->created_at) >= $from && $this->getMkTime($item->created_at)<=$to && $item->order_status == $filter_status){
                    $data['orders'][] = $item;
                }
            }elseif(!isset($filter_status) && isset($filter_language)){
                if($this->getMkTime($item->created_at) >= $from && $this->getMkTime($item->created_at)<=$to && $item->lang == $filter_language){
                    $data['orders'][] = $item;
                }
            }elseif(isset($filter_status) && isset($filter_language)){
                if($this->getMkTime($item->created_at) >= $from && $this->getMkTime($item->created_at)<=$to && $item->order_status == $filter_status && $item->lang == $filter_language){
                    $data['orders'][] = $item;
                }
            }else{
                if($this->getMkTime($item->created_at) >= $from && $this->getMkTime($item->created_at)<=$to){
                    $data['orders'][] = $item;
                }
            }
Answer 1

Ну эстетичнее было бы вынести условия

$this->getMkTime($item->created_at) >= $from && $this->getMkTime($item->created_at)<=$to

В отдельную переменную, Плюс isset($filter_status) как отдельную переменную и isset($filter_language) как отдельную переменную. Была бы проверка типа if (a&b) elseif(a&!b), а саму структуру проверок можно сделать как:

if(a){
    if(b){} 
    else{}
}
else{ 
    if(b) 
    else{}
}

Но это вкусовщина же!

Answer 2

На эту тему прочитайте 10-11 главы "Совершенный код" (с) Стив Макконнелл

Почему у Вас для всех условий одинаковый вывод я не понимаю, но основной затык в читаемости, я бы сделал так. Кода больше, но прочитать легче.

И еще у Вас недоработка в структуре If в этой части условия $this->getMkTime($item->created_at) >= $from && $this->getMkTime($item->created_at)<=$to Это условие всегда одинаково и его можно вынести на самый верх

$filterLanguage = isset($filter_language) ? $filter_language : null;
$filterStatus = isset($filter_status) ? $filter_status : null;
$itemCreatedTime = $this->getMkTime($item->created_at);
$filterSearchFromTime = $from;
$filterSearchToTime = $to;
$searchByStatus = ($filterStatus !== null);
$searchByLanguage = ($filterLanguage !== null);
$itemTimeMatchFilterTime = ($itemCreatedTime >= $filterSearchFromTime && $itemCreatedTime <= $filterSearchToTime);
$itemStatusMatchFilter = ($item->order_status == $filter_status);
$itemLanguageMatchFilter = ($item->lang == $filter_language);
if ($itemTimeMatchFilterTime) {
    if ($searchByStatus && !$searchByLanguage && $itemStatusMatchFilter)
        $data['orders'][] = $item;
    else if (!$searchByStatus && $searchByLanguage && $itemLanguageMatchFilter)
        $data['orders'][] = $item;
    else if ($searchByStatus && $searchByLanguage && $itemStatusMatchFilter && $itemLanguageMatchFilter)
        $data['orders'][] = $item;
    else
        $data['orders'][] = $item;
}

P.S. А вообще у Вас вся логика сводится к

$itemCreatedTime = $this->getMkTime($item->created_at);
$filterSearchFromTime = $from;
$filterSearchToTime = $to;
$itemTimeMatchFilterTime = ($itemCreatedTime >= $filterSearchFromTime && $itemCreatedTime <= $filterSearchToTime);
if ($itemTimeMatchFilterTime) {
         $data['orders'][] = $item;
    }

То есть фильтры Статус и Язык бесполезны, так как результат от них не зависит. Не думаю, что это именно то, чего вы хотели

Answer 3

Ну это сугубо моя мысль:

$gt_time = $this->getMkTime($item->created_at);
$ords = $item->order_status;
$lang = $item->lang;
if ( ($gt_time >= $from && $gt_time <= $to && $ords == $filter_status) || ($gt_time >= $from && $gt_time <= $to && $lang == $filter_language) || ($gt_time >= $from && $gt_time<=$to && $ords == $filter_status && $lang == $filter_language) ) {
  $data['orders'][] = $item;
} elseif ($gt_time >= $from && $gt_time <= $to) {
  $data['orders'][] = $item;
}
READ ALSO
Проблема с создание автозамены кода на странице

Проблема с создание автозамены кода на странице

Суть кода в том, что при наличии определнного кода на странице например "view_plugin(1)", он должен замениться на данные полученные из базы misqlНо...

175
вызов метода внутри метода php

вызов метода внутри метода php

не могу понять почему ничего не выводитсяЕсть объявление, есть вызов с параметром

213
Сохранить значение PHP

Сохранить значение PHP

Подскажите с примеромИмеется страничка на ней я считываю значение переменной если пользователь пришел первый раз и кладу это значение в $_COOKIE

188
Как задать выход из программы? [требует правки]

Как задать выход из программы? [требует правки]

В приложении есть кнопка выход? Как сделать, чтобы при нажатии на нее программа завершалась?

215