为什么将两个值作为字符串进行比较?

时间:2018-10-23 10:26:20

标签: php validation types

我有两天无法解决的问题。我想比较两个代表年份的值。首先是用户提交的字符串-仅包含4位数字。第二个是来自date('Y')函数的字符串,也是4位数字。我想检查一下我是否比另一年更快乐。但是,如果$ string的字符多于date函数的结果,则比较结果为true。即使我将两个字符串都转换为整数。我也尝试使用intval函数进行转换。在比较之前,我已经在两种情况下都检查了gettype()的两个值,它们是同一类型。有趣的是,如果我将这段代码放到phpfiddle中,它就会像我想要的那样工作。

$string = '2020';
$isTooBig = $string > date('Y');

$isTooBig1 = (int)$string > (int)date('Y');
//In this case $isTooBig is boolean with 0 value;

完整代码:

function whatIsWrong( $type, $string ) {
    $comma = '';
    $json = '';
    if ( $type == 'year' ) {
        $yearOverLimit = $string > date('Y') && strlen($string) == 4; //problem is here
        $fieldIsEmpty = strlen( $string ) == 0;
        $charIsWrong = !preg_match( '/^\d{4}$/', $string ) && !strlen($string) == 0;
        $json .= ' [';
        if ( $fieldIsEmpty ) {
            if ( $yearOverLimit || $charIsWrong ) {
                $comma = ', ';
            } else {
                $comma = '';
            }
            $json .= '{"message": "Year can\'t be empty"}'.$comma;
        }
        if ( $yearOverLimit ) {
            if ( $charIsWrong ) {
                $comma = ', ';
            } else {
                $comma = '';
            }
            $json .= '{"message": "Year must be between 1870-'.date('Y').'"}'.$comma;
        }
        if ( $charIsWrong ) {
            $json .= '{"message": "Year must be 4-digit"}';
        }
        $json .= ']';
    }
    return $json;
}

1 个答案:

答案 0 :(得分:0)

@Werner说:“

  

因此,$yearOverLimit仅在$string > 2018 (curr yr)和4位数字时为真。

我知道,应该,这是我的意图。但是它不在我的编辑器(vim)中,也不知道为什么。 如果年份是YYYY,则(int)$string > (int)date('Y')(不包含strlen)返回false,如果YYYYY或更大,则返回true。我真笨。也许是PHP版本的差异?