2010-03-19 2 views
12

최근에 이해할 수없는 in_array에 관한 이상한 문제가 있습니다. 예 :in_array의 문제

$a = array('a','b','c'); 
$b = array(1,2,3); 

if (in_array(0,$a)) 
{ 
    echo "a bingo!\n"; 
} 
else 
{ 
    echo "a miss!\n"; 
} 

if (in_array(0,$b)) 
{ 
    echo "b bingo!\n"; 
} 
else 
{ 
    echo "b miss!\n"; 
} 

나는 나의 램프를 달리고,

a bingo! 
b miss! 

내가 설명서를 읽고 그게 내가 항상 필요 의미 하는가 $strict true으로는, 그때는 expected.But로 일 세 번째 매개 변수를 설정 얻었다 in_array을 사용할 때 strict 매개 변수를 true로 설정 하시겠습니까?

감사

+0

Clear.Thanks all. – Young

답변

17

을 그것은 당신이 당신은 단지 값을 비교하지 에 비교를 할 때 true에 세 번째 매개 변수를 설정하는 의미뿐만 아니라 유형.

그렇지 않으면 비교를 수행하는 동안 형식 변환이 있습니다 (예 : String conversion to numbers 참조). Comparison Operators를 참조 -없이 엄격한와 사실

, in_array== 사이 === 당신이해야처럼 같은 차이입니다.

이 변환은 대부분 정상적으로 작동합니다. 그러나 문자로 시작하는 문자열과 0을 비교하려고하는 경우는 아닙니다. 문자열은 숫자로 변환됩니다. 0을 값으로 사용합니다.

1

첫 번째 예에서 배열 $ a의 모든 값은 숫자로 변환 될 때 0입니다. 따라서 첫 번째 예는 "빙고"가됩니다.

암시 적 변환에 의존하거나 데이터 유형이 동일하다 (예 : 문자열 배열에서 문자열을 검색하는 경우) strict 매개 변수를 사용할 필요가 없습니다. 그렇지 않으면 strict 매개 변수를 사용해야합니다. 같은 유형이어야하는 두 값을 비교할 때 == 대신 ===를 사용해야합니다.

6

in_array의 "기본"모드는 == comparison operator처럼 loose comparison을 사용합니다. 그 말 0는 다음과 같이 비교된다 : 숫자 문자열은 문자열과 숫자를 비교하거나 비교가 관련된 경우 각,

:

var_dump(0 == 'a'); // bool(true) 
var_dump(0 == 'b'); // bool(true) 
var_dump(0 == 'c'); // bool(true) 

이제 loose comparison operator == 실제로 값을 비교하기 전에 string conversion to integer을 사용하고 있습니다 문자열이 숫자로 변환되고 비교가 숫자로 수행됩니다.

그리고 'a', 'b''c' 모든 0로 변환됩니다 :

var_dump((int) 'a'); // int(0) 
var_dump((int) 'b'); // int(0) 
var_dump((int) 'b'); // int(0) 

그러나 엄격 모드에서 in_array를 사용하는 경우 (사실에 세 번째 매개 변수를 설정)을하는 strict comparison (===) 모두를 의미, 완료 값과 유형은 동일해야합니다 :

var_dump(0 === 'a'); // bool(false) 
var_dump(0 === 'b'); // bool(false) 
var_dump(0 === 'c'); // bool(false) 

그래서 wh 엉뚱한 모드에서 in_array을 사용하는 경우 예상 결과가 나타납니다.

var_dump(in_array(0, $a, true)); // bool(false)