Если утверждение не работает правильно - PullRequest
0 голосов
/ 15 января 2010

Возможно, я делаю это неправильно, но взгляните. Если я жестко закодирую логику, она сработает, но не будет, если я попытаюсь использовать ее как переменную.

if($range <= 50) {
    $operator = "<=";
} else {
    $operator = ">=";
}

foreach($cursor as $s) {
    $data = round($this->distance($zip_lat, $zip_lon, $s["lat"],$s["lon"]), 2);

    if ($data .$operator. $range) {
        $zipcodes[] = "$s[zipcode]";   
    }
}               

Я имею в виду, я мог бы добавить if / else внутри foreach, но не был уверен, добавляет ли он какие-либо «накладные расходы».

Ответы [ 7 ]

5 голосов
/ 15 января 2010

попробовать:

if ($range <= 50 ? $data <= $range : $data >= $range) {

}

или используйте eval ()

4 голосов
/ 15 января 2010
 if ($data .$operator. $range) 

Всегда верно, поскольку это строка, а не ноль.

Вы можете найти проблему, используя этот простой код:

$data="0";
$operator=">=";
$range="1";

if ($data .$operator. $range) {
       echo   $data .$operator. $range . " is true !";   
}                   
1 голос
/ 15 января 2010

Я очень подозреваю, что if просто вычисляет строку $ date. $ Operator. $ Range (которая всегда будет возвращать true), так как все, что вы делаете - это объединение оператора и операндов вместе.

Таким образом, вам может понадобиться eval (утка и прикрытие людей, утка и прикрытие) содержимого if.

1 голос
/ 15 января 2010

«Точки» выполняют только обычную «строковую» конкатенацию - вы не можете ожидать, что они (введенные как строки) будут вести себя как обычные «настоящие» операторы.

Подумайте об этом: если $data = 'data1' и $range = 50, то ваше утверждение if становится:

if ('data1<=50'), который, вероятно, будет просто принимать значение true или false, так же как if ('yournamehere') или if('randommumbojumbo')

0 голосов
/ 15 января 2010

Вы не можете иметь переменную, представляющую оператор оценки. Вы должны будете переключить свой код на что-то вроде:

foreach ($cursor as $s) {
    $data = round($this->distance($zip_lat, $zip_lon, $s["lat"],$s["lon"]), 2);
    if ($range <= 50 && $data <= $range) {
        $zipcodes[] = $s['zipcode'];
    } else if ($data >= $range) {
        $zipcodes[] = $s['zipcode'];
    }
}
0 голосов
/ 15 января 2010

Я думаю, вам нужно сделать это:

foreach ( $cursor as $s ) {
    $data = round($this->distance($zip_lat, $zip_lon, $s["lat"],$s["lon"]), 2);
    if ( $range <= 50 ) {
      if ( $data <= $range ) {
          $zipcodes[] = "$s[zipcode]";   
      }
    } else {
      if ( $data >= $range ) {
          $zipcodes[] = "$s[zipcode]";   
      }
    }
}   
0 голосов
/ 15 января 2010

Вы, похоже, пропускаете закрытие}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...