代码之家  ›  专栏  ›  技术社区  ›  xkeshav

在PHP中,我需要一行if条件用于时间比较

php
  •  -3
  • xkeshav  · 技术社区  · 14 年前

    我必须重视

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

    现在我需要一个if条件来显示下面条件的错误

    1. 如果其中一个($mo或$mc)为空,则为空或空。
    2. 如果关闭时间($mc)小于打开时间($mo)

    意味着如果两者都为空(空)或$mc>$mo,则继续

    请建议对此条件优化一行

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

    if(($mo==NULL && $mc!=NULL) || ( $mo>=$mc && ($mo!=NULL && $mc!=NULL))  )
    
    4 回复  |  直到 14 年前
        1
  •  2
  •   Mike Sherov    14 年前

    在PHP中,strotime将返回整数或false。在这种情况下,检查空值永远不会产生结果,否则…

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

    糟糕,为了正确而编辑。不过,我转置了$mc和$mo.xor应该是正确的。

        2
  •  6
  •   Brian Lacy    14 年前

    请记住,0、空和空白在这里的含义完全不同。如前所述,strToTime永远不会返回空值。然而, 是有效的Unix时间戳,而 表示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
  •  3
  •   Pekka    14 年前

    好的。这个怎么样?

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

    我把它分成一大块代码。在开始的时候,当学习语言时,这是从代码中获得意义的最好方法。它不是最优雅的,也不是迄今为止最短的解决方案。稍后,您可以通过删除空白或引入 or 还有东西。

    我对数字比较部分不是百分之百的确定,我现在没有时间检查它。你得试试它是否有效。

    您需要决定如何处理错误,并将代码插入到我的注释所在的位置。简单的 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!!
    
          }
    
     }
    
        4
  •  0
  •   Andreas    14 年前

    你可以试试:

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

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