PHP: условный оператор с возможными пустыми переменными - PullRequest
0 голосов
/ 01 августа 2010

Я создаю пользовательскую форму поиска, и при попытке сортировки результатов отображаются все объекты вместо соответствующих критериев.Причина, по которой я обнаружил, заключалась в том, что некоторые входные данные из формы не имеют значения по умолчанию, и когда это не объявляется в условном выражении позже (для сортировки), оно просто показывает все объекты, соблюдаются ли другие требования илине.Я попытался применить оператор OR с конкретными переменными, которые могут быть пустыми, но он дал тот же результат.Примерно так:

<?php if ($bedrooms >= $min_rooms 
          && $bedrooms <= $max_rooms 
          && $space >= $min_space 
          && $space <= $max_space 
          && $price >= $min_price 
          && $price <= $max_price 
          && $sel_type == $type 
          || $sel_type == '' 
          && $country == $sel_country 
          || $sel_country == '' ) { ?>

(см. Последние два утверждения). Я думал о проверке каждой переменной в условном выражении перед ее включением, но это выглядит как ненужный код.Как бы вы это сделали?

Ответы [ 2 ]

3 голосов
/ 01 августа 2010

Оператор && имеет более высокий приоритет, чем оператор ||, поэтому ваше выражение в настоящее время сгруппировано следующим образом, вероятно, не то, что вам нужно:

($bedrooms >= $min_rooms && $bedrooms <= $max_rooms && $space >= $min_space && $space <= $max_space && $price >= $min_price && $price <= $max_price && $sel_type == $type)
||
($sel_type == '' && $country == $sel_country)
||
($sel_country == '' )

Попробуйте добавить такие круглые скобки, чтобы достичьправильная группировка:

($bedrooms >= $min_rooms && $bedrooms <= $max_rooms && $space >= $min_space && $space <= $max_space && $price >= $min_price && $price <= $max_price && ($sel_type == $type || $sel_type == '') && ($country == $sel_country || $sel_country == '') )
1 голос
/ 01 августа 2010

Ваше выражение может завершиться ошибкой, так как оператор && имеет более высокий приоритет , чем операция ||.Это означает, что выражение вроде этого:

… && $sel_type == $type || $sel_type == ''

эквивалентно этому (приоритет оператора выделяется с помощью скобок):

(… && $sel_type == $type) || $sel_type == ''

Чтобы исправить это, поместите выражения || в скобки:

$bedrooms >= $min_rooms && $bedrooms <= $max_rooms && $space >= $min_space && $space <= $max_space && $price >= $min_price && $price <= $max_price && ($sel_type == $type || $sel_type == '') && ($country == $sel_country || $sel_country == '')

Кроме того, ваше выражение, вероятно, будет легче читать и поддерживать, если вы используете некоторые вспомогательные функции, такие как between function:

function between($val, $min, $max) {
    return $min <= $val && $val <= $max;
}

Тогда ваше выражение будет читать:

between($bedrooms, $min_rooms, $max_rooms) && between($space, $min_space, $max_space) && between($price, $min_price, $max_price) && ($sel_type == $type || $sel_type == '') && ($country == $sel_country || $sel_country == '')
...