복붙노트

문자열을 정수와 비교하면 이상한 결과가 나타납니다.

PHP

문자열을 정수와 비교하면 이상한 결과가 나타납니다.

이 작업이 왜 효과가 있는지 나는 정말로 혼란 스럽다. 누군가 그것을 설명 할 수 있습니까?

$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
$test2 = "3581169b064f71be1630b321d3ca318f";

if ($test1 == 0)
  echo "Test 1 is Equal!?";
if ($test2 == 0)
  echo "Test 2 is Equal!?";

// Returns: Test 1 is Equal!?

설명을 위해 문자열 "0"을 $ test 변수와 비교하려고합니다. 나는 이미 코드를 고쳐야한다는 것을 알고있다. "0"을 포함해야한다.

이 PHP 버그, 서버 버그, 또는 어떻게 든 유효한 작동 궁금하네요. http://us3.php.net/types.comparisons에 따르면 이것은 효과가 없어야합니다.

편집 : 스크래치, 분명히 그것은 문자열과 0 사이의 루즈 비교가 사실이라고 언급하지 않습니다. 그러나 나는 아직도 이유를 모른다.

편집 2 : "3581169b064f71be1630b321d3ca318f"의 $ test2 값이 작동하지 않는 이유는 무엇입니까?

해결법

  1. ==============================

    1.PHP 매뉴얼에서 :

    PHP 매뉴얼에서 :

  2. ==============================

    2.== 연산자를 사용한 형식 변환

    == 연산자를 사용한 형식 변환

    == 연산자는 느슨한 형식의 비교입니다. 두 유형을 공통 유형으로 변환하고 비교합니다. 여기서 문자열을 정수로 변환하는 방법을 설명합니다.

    링크 한 페이지가이 페이지와 모순되지 않습니다. 두 번째 테이블에서 정수 = 0을 ==를 사용하여 문자열 "php"와 비교하면 true가됩니다.

    문자열은 정수로 변환되고 숫자가 아닌 문자열 (숫자가 포함되거나 시작되지 않는 문자열)은 0으로 변환됩니다.

    숫자 대 숫자가 아닌 문자열

    숫자로 구성되거나 숫자로 시작되는 문자열은 숫자 문자열로 간주됩니다. 해당 숫자 뒤에 다른 문자가있는 문자열은 무시됩니다.

    문자열이 숫자의 일부로 해석 될 수없는 문자로 시작하는 경우 숫자가 아닌 문자열이며 0으로 변환됩니다. 숫자 문자열이 숫자 (0-9 ) - 예를 들어 "-1"은 빼기 기호가이 경우 숫자의 일부이기 때문에 숫자 문자열입니다.

    예를 들어 문자열 "d85d1d81b25614a3504a3d5601a9cb2e"는 숫자로 시작하지 않으므로 0으로 변환됩니다. 그러나 두 번째 문자열 "3581169b064f71be1630b321d3ca318f"는 정수 3581169로 변환됩니다. 따라서 두 번째 테스트가 같은 방식으로 작동하지 않습니다.

    당신이해야 할 일

    당신은 아마 원한다 :

    if ($test1 === "0")
    

    이중 같음 대신에 3 중 같음을 사용합니다. 이렇게하면 비교 대상이 숫자 0 만 포함하는 문자열이며 모든 유형 변환이 방지됩니다.

  3. ==============================

    3.몇 가지 조사가 끝나면 PHP 매뉴얼에서 aidan이 숫자로 시작하지 않는 문자열은 정수로 캐스팅 될 때 0으로 변환된다는 것을 알게되었습니다.

    몇 가지 조사가 끝나면 PHP 매뉴얼에서 aidan이 숫자로 시작하지 않는 문자열은 정수로 캐스팅 될 때 0으로 변환된다는 것을 알게되었습니다.

    이는 다음을 의미합니다.

    ("php" == 0) === true
    ("1php" == 0) === false
    

    매우 성가신 잘 문서화되지 않습니다. 형식 비교 페이지의 주석 맨 아래에있었습니다.

  4. ==============================

    4.

    $test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
    

    이 문자열은 유효한 숫자가 아닌 "d"로 시작하며, var는 0으로 해석되고 테스트 # 1이 통과합니다.

    $test2 = "3581169b064f71be1630b321d3ca318f";
    

    이 문자열은 유효한 숫자 인 3581169로 시작하므로 var는 0이 아닌 값으로 해석됩니다. 따라서 테스트 # 2는 통과하지 못합니다.

  5. ==============================

    5.몇 가지 변환 및 비교를 사용하여 숫자 문자열이 숫자인지 테스트했습니다.

    몇 가지 변환 및 비교를 사용하여 숫자 문자열이 숫자인지 테스트했습니다.

    $test1="19de6a91d2ca9d91721d82f1bd8102b6";
       echo (float)$test1==$test1; //TRUE
       echo is_float($test1); //FALSE
    
       //Converting the string to float and then converting it to string and compare will do the trick 
       echo (string)((float)$test1)==(string)$test1; //FALSE
    
    
    $test2="5.66";
       echo (float)$test2==$test2; //TRUE
    
       //Testing the numeric string using `is_float` wont give the expected result
       echo is_float($test2); //FALSE
    
       echo (string)((float)$test2)==(string)$test2; //TRUE
    
  6. from https://stackoverflow.com/questions/672040/comparing-string-to-integer-gives-strange-results by cc-by-sa and MIT license