в php мне нужна одна строка, если сравнивать условие для времени - PullRequest
0 голосов
/ 04 февраля 2010

Мне нужно оценить

 $mo=strtotime($input_array['MondayOpen']);
 $mc=strtotime($input_array['MondayClose']);

теперь мне нужно условие if для отображения ошибки при следующих условиях

  1. если один из них ($ mo или $ mc) пустой, нулевой или пустой.
  2. если время закрытия ($ mc) меньше времени открытия ($ mo)

означает, что если оба значения пусты (null) или $ mc> $ mo, тогда идем дальше

пожалуйста, предложите оптимизировать одну строку, если условие для этого

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

if(($mo==NULL && $mc!=NULL) || ( $mo>=$mc && ($mo!=NULL && $mc!=NULL))  )

Ответы [ 4 ]

6 голосов
/ 04 февраля 2010

Имейте в виду, что 0, ноль и пробел здесь означают совершенно разные вещи. Как указывалось ранее, strtotime никогда не вернет NULL. Однако 0 является действительной меткой времени Unix, тогда как false означает, что функция strtotime не смогла обработать указанное значение.

Также вы запросили однострочное решение; однако, на мой взгляд, в этом случае гораздо лучше выписать каждое условие и отобразить отдельное сообщение об ошибке для каждого условия. Таким образом, пользователь знает, что на самом деле пошло не так. Возможно, это лучший способ:

// Only check for errors if we have at least one value set
if (!empty($input['MondayOpen']) || !empty($input['MondayClosed']) {
    $mo = strtotime($input['MondayOpen']);
    $mc = strtotime($input['MondayClosed']);

    $invalid = false;
    if (false === $mo) {
        echo "Invalid Opening Time\n";
        $invalid = true;
    }

    if (false === $mc) {
        echo "Invalid Closing Time\n";
        $invalid = true;
    }

    if (!$invalid && $mc <= $mo) {
        echo "Closing time must be After Opening Time\n";
        $invalid = true;
    }

    if ($invalid) {
        exit();  // Or handle errors more gracefully
    }
}

// Do something useful
3 голосов
/ 05 февраля 2010

Хорошо. Как насчет этого?

Проверяет, являются ли $ mo и $ mc действительными датами, используя is_numeric. Любые NULL или ложные значения будут пойманы этим. Я не проверял это, но оно должно работать.

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

Я не уверен на 100% в части сравнения чисел, и у меня нет времени, чтобы проверить это прямо сейчас. Вам нужно будет проверить, работает ли он.

Вам нужно решить, как вы хотите обрабатывать ошибки, и вставить код туда, где находятся мои комментарии. Простой echo может уже сделать.

// If $mo or $mc are false, show error. 
// Else, proceed to checking whether $mo is larger
// than $mc.

if ((!is_numeric($mo)) and (is_numeric($mc)))
 {
   // Error: $mo is either NULL, or false, or something else, but not a number.
   // While $mc IS a number.
 }
elseif ((!is_numeric($mc)) and (is_numeric($mo)))
 {
   // Error: $mc is either NULL, or false, or something else, but not a number.
   // While $mo IS a number. 
 }
else
 {

   if (($mc <= $mo) and ((is_numeric($mc) or (is_numeric($mo)))))
    {
       // Error: closing time is before opening time.
    }
    else
     {
       // Success!!

      }

 }
2 голосов
/ 04 февраля 2010

в php, strotime вернет целое число или значение false. Проверка на ноль в этом случае никогда не принесет плодов, но в противном случае ...

if((!$mo xor !$mc) || ($mc && $mc<=$mo)){
  print('error');
}else{
 print('no_error');
}

упс, отредактировано для корректности. Я переставил $ mc и $ mo. XOR должен быть правильным, хотя.

0 голосов
/ 04 февраля 2010

Вы можете попробовать:

print ((empty($mo) && empty($mc)) || ($mc > $mo)) ? 'case_true_message' : 'case_false_message';

Но вы также должны проверить руководство :) - для базовых структур управления

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