2012-02-13 2 views
6

다음과 관련하여 일부 데이터 파싱 코드를 작성하고있었습니다.이상한 PHP 문자열 정수 비교 및 ​​변환

$line = "100 something is amazingly cool"; 
$key = 100; 

var_dump($line == $key); 

그럼 우리 대부분은 덤프가 false을 생산하는 기대하지만 놀랍게도에 덤프는 true이었다!

$x = 5 + "10 is a cool number"; // as documented on PHP manual 
var_dump($x); // int(15) as documented. 

하지만 첫 번째 예에서 언급 한 방법과 같은 비교가 변환 않는 이유를 내 문자열을 문자열로 정수를 변환하는 대신 정수로 :

나는 PHP에서 같은 유형 변환이 있음을 이해한다.

난 당신이 내 예에 === 엄격한 비교를 할 수있는 이해,하지만 난 그냥 알고 싶어

  • 이 동작에 언급은 PHP 문서의 어떤 부분이 있습니까?
  • PHP에서 왜 그런 일이 일어날 지 설명 할 수 있습니까?
  • 어떻게 프로그래머가 이러한 문제를 방지 할 수 있습니까?
+0

== 나는 숫자 비교를한다고 생각합니다. 그리고 숫자를 문자열로 가져 와서 숫자로 변환하면 그 숫자를 사용합니다. 아마 NaN과 같은 것을 반환하지 않는다면. – rubixibuc

+0

우리 대부분은 이것을 기대할 것입니다 ....문자열을 정수로 캐스팅 할 때 (문자열을 숫자와 비교할 때와 같이), PHP는 첫 번째 숫자가 아닌 숫자 (이 경우 100 자리 숫자와 "무언"사이)에서 멈 춥니 다. SO 100은 결과 값입니다. –

+0

참조 http://stackoverflow.com/a/8672423 – Gumbo

답변

4

정확하게 recally하면 PHP는 두 변수를 가능한 가장 낮은 유형으로 '변환'합니다. 그들은 저글링이라고 부릅니다.

시도 : 예 : var_dump("something" == 0); 예를 들어, 사실 일 겁니다. . 한 번 전에 나를 물려고했다.

상세 정보 : http://php.net/manual/en/language.operators.comparison.php

+0

PHP 매뉴얼은 이제 http://php.net/manual/en/language.types.type-juggling.php에서 형식 저글링을 설명하며, 이것은 http://php.net/manual의 숫자로 문자열 변환에 대한 섹션으로 연결됩니다. /en/language.types.string.php#language.types.string.conversion –

1

나는이 이미 대답 수락 알고 있지만 내가 검색을 통해이를 찾아 다른 사람들을 도울 수 뭔가를 추가하고 싶었다.

게시 배열과 PHP 배열의 키를 비교했을 때 동일한 문제가 발생했습니다.이 배열은 포스트 배열에 추가 문자열 값이 있습니다. 당신이 마지막에 $foo[0]["bar"]"0"과 동일하지만 무슨 일이 일어 것은 $key = int 0 느슨하게 $bar = string "other"과 비교했을 때 결과가이 문제를 해결하는 true이었다이다 것이라고 생각이에서

$_POST["bar"] = array("other"); 

$foo = array(array("name"=>"foobar")); 

foreach($foo as $key=>$data){ 
    $foo[$key]["bar"]="0"; 
    foreach($_POST["bar"] as $bar){ 
     if($bar==$key){ 
      $foo[$key]["bar"]="1"; 
     } 
    } 
} 

, 나는 엄격하게 비교,하지만 필요 POST가 배열이 array("other","0");로 정의되었을 때이 일을 다음에 대한 $key = string "0"$key = int 0 변환 : 결과는
$_POST["bar"] = array("other"); 

$foo = array(array("name"=>"foobar")); 

foreach($foo as $key=>$data){ 
    $foo[$key]["bar"]="0"; 
    foreach($_POST["bar"] as $bar){ 
     if($bar==="$key"){ 
      $foo[$key]["bar"]="1"; 
     } 
    } 
} 

했다 $foo[0]["bar"]="1"경우 "0"이 POST 막대 배열에 없으면은 POST 막대 배열에 있고 $foo[0]["bar"]="0"입니다.

변수를 비교할 때 PHP의 느슨한 변수 입력으로 인해 변수가 비교되지 않을 수 있음을 기억하십시오.

+0

어쩌면 그것은 나뿐입니다. 그러나 당신의 예는 그 자신의 이익을 위해 너무 복잡합니다. 이 문제는'$ foo'를 일반적인 배열 내에 중첩 된 연관 배열로 정의한 다음, 연관 배열 표현식'($ key => $ data)'를 사용하여 정규 배열을 구문 분석하는 것으로 보입니다. 데이터에이 겹치기가 있어야하는 경우 일반 배열을 처리 할 다른 루프 내에서 해당 루프를 중첩하지 않는 이유는 무엇입니까? –