문자열을 정수와 비교하면 이상한 결과가 나타납니다.
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.PHP 매뉴얼에서 :
PHP 매뉴얼에서 :
-
==============================
2.== 연산자를 사용한 형식 변환
== 연산자를 사용한 형식 변환
== 연산자는 느슨한 형식의 비교입니다. 두 유형을 공통 유형으로 변환하고 비교합니다. 여기서 문자열을 정수로 변환하는 방법을 설명합니다.
링크 한 페이지가이 페이지와 모순되지 않습니다. 두 번째 테이블에서 정수 = 0을 ==를 사용하여 문자열 "php"와 비교하면 true가됩니다.
문자열은 정수로 변환되고 숫자가 아닌 문자열 (숫자가 포함되거나 시작되지 않는 문자열)은 0으로 변환됩니다.
숫자 대 숫자가 아닌 문자열
숫자로 구성되거나 숫자로 시작되는 문자열은 숫자 문자열로 간주됩니다. 해당 숫자 뒤에 다른 문자가있는 문자열은 무시됩니다.
문자열이 숫자의 일부로 해석 될 수없는 문자로 시작하는 경우 숫자가 아닌 문자열이며 0으로 변환됩니다. 숫자 문자열이 숫자 (0-9 ) - 예를 들어 "-1"은 빼기 기호가이 경우 숫자의 일부이기 때문에 숫자 문자열입니다.
예를 들어 문자열 "d85d1d81b25614a3504a3d5601a9cb2e"는 숫자로 시작하지 않으므로 0으로 변환됩니다. 그러나 두 번째 문자열 "3581169b064f71be1630b321d3ca318f"는 정수 3581169로 변환됩니다. 따라서 두 번째 테스트가 같은 방식으로 작동하지 않습니다.
당신이해야 할 일
당신은 아마 원한다 :
if ($test1 === "0")
이중 같음 대신에 3 중 같음을 사용합니다. 이렇게하면 비교 대상이 숫자 0 만 포함하는 문자열이며 모든 유형 변환이 방지됩니다.
-
==============================
3.몇 가지 조사가 끝나면 PHP 매뉴얼에서 aidan이 숫자로 시작하지 않는 문자열은 정수로 캐스팅 될 때 0으로 변환된다는 것을 알게되었습니다.
몇 가지 조사가 끝나면 PHP 매뉴얼에서 aidan이 숫자로 시작하지 않는 문자열은 정수로 캐스팅 될 때 0으로 변환된다는 것을 알게되었습니다.
이는 다음을 의미합니다.
("php" == 0) === true ("1php" == 0) === false
매우 성가신 잘 문서화되지 않습니다. 형식 비교 페이지의 주석 맨 아래에있었습니다.
-
==============================
4.
$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
이 문자열은 유효한 숫자가 아닌 "d"로 시작하며, var는 0으로 해석되고 테스트 # 1이 통과합니다.
$test2 = "3581169b064f71be1630b321d3ca318f";
이 문자열은 유효한 숫자 인 3581169로 시작하므로 var는 0이 아닌 값으로 해석됩니다. 따라서 테스트 # 2는 통과하지 못합니다.
-
==============================
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
from https://stackoverflow.com/questions/672040/comparing-string-to-integer-gives-strange-results by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
PHP에서 쓰레드 안전하거나 쓰레드 안전하지 않은 것은 무엇입니까? (0) | 2018.09.16 |
---|---|
PHP : 경고 : sort ()는 매개 변수 1이 배열이고, 주어진 자원이 [duplicate] (0) | 2018.09.16 |
잘못된 정수 (2147483647)가 MySQL에 삽입됩니까? (0) | 2018.09.16 |
가변 크기 변수 목록을 가진 MySQL Prepared 문 (0) | 2018.09.16 |
어떻게 PHP에서 .bat 파일을 실행합니까? (0) | 2018.09.15 |