Почему два значения сравниваются как строка? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть проблема, которую я не могу решить в течение двух дней.Я хочу сравнить два значения, представляющие год.Сначала строка, представленная пользователем - содержит только 4 цифры.Второй - строка из функции date('Y'), также 4 цифры.Я хочу проверить, один год я терю, чем другой.Но результат сравнения равен true, если $ string содержит больше символов, чем результат функции date.Даже если я преобразую обе строки в целое число.Я также пробовал преобразование с использованием функции 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 голосов
/ 24 октября 2018

@ Вернер сказал: "

Следовательно, $yearOverLimit будет истинно, только если $string > 2018 (curr yr) и только 4 цифры.

Я знаю, это должно быть,это мое намерение. Но его нет в моем редакторе (vim) и я не знаю, почему. (int)$string > (int)date('Y') (без strlen) возвращает false, если год равен любому из ГГГГ, вернуть true, если ГГГГ или больше. Iя тупой. Может, это различия в версии PHP?

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