在PHP我需要一行如果条件的时间比较

时间:2010-02-04 18:57:20

标签: php

我必须重视

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

现在我需要if条件才能在以下条件下显示错误

  1. 如果其中一个($ mo或$ mc)为空,空或空白。
  2. 如果关闭时间($ mc)小于开放时间($ mo)
  3. 表示如果两者都为空(null)或$ mc> $ mo则进一步

    如果条件适用,请建议优化一行

    我知道这似乎是一个非常基本的问题,但是当两者都为空时我面临问题 或者我使用的是简单的

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

4 个答案:

答案 0 :(得分:6)

请记住,0,null和空白都意味着完全不同的东西。如前所述,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

答案 1 :(得分:3)

好的。怎么样。

使用is_numeric检查$ mo和$ mc是否为有效日期。任何NULL或false值都将被捕获。 我没有测试过,但它应该可以工作。

我将它传播到一个巨大的代码块中。一开始,在学习语言时,这是从代码中理解的最佳方式。它不是最优雅,也不是最短的解决方案。稍后,您可以通过删除空格或引入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 :(得分:2)

在php中,strotime将返回一个整数或false。在这种情况下检查null将永远不会结果,否则......

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

oops,编辑正确性。我转换了$ mc和$ mo。虽然XOR应该是正确的。

答案 3 :(得分:0)

您可以尝试:

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

但你也应该检查手册:) - 用于基本控制结构