현재 위치: > 최신 기사 목록> 부울은 왜 array_diff ()에서 비정상적으로 행동합니까?

부울은 왜 array_diff ()에서 비정상적으로 행동합니까?

M66 2025-06-06

매일 PHP 프로그래밍에서 Array_Diff ()는 두 배열의 차이를 찾는 데 사용할 수있는 매우 실용적인 기능입니다. 그러나이 기능을 사용할 때 많은 개발자가 이상한 상황에 직면 할 수 있습니다.

무슨 일이야? 함께 이유를 함께 탐색합시다.

1. 간단한 예 : 부울 값의 예외 동작

다음 코드를 살펴 보겠습니다.

 $a = [true, false];
$b = [0];

$result = array_diff($a, $b);
print_r($result);

당신은 truefalse가 배열 $ b 에 없다고 직관적으로 생각할 수 있으므로 $ result는 [true, false] 이어야하지만 실제로 다음과 같은 출력을 얻게됩니다.

 Array
(
    [0] => 1
)

당신은 조금 혼란 스럽습니까? 오 탐지가 필터링되는 이유는 무엇입니까? 그리고 진실 도 정수 1이 됩니다. 이 문제를 점차적으로 분해합시다.

2. Array_Diff () 작동 방식

먼저 Array_Diff () 의 기본 동작을 이해해야합니다. 공식 PHP 문서 의 지침에 따르면 :

Array_diff ()는 "비 스트릭 비교"(==)를 사용하여 값이 동일인지 확인합니다.

즉, array_diff ()는 값을 비교하기 위해 합동 ==를 사용하지 않지만 이중 동일 부호 ==를 사용합니다.

이것은 다음 값이 "동일"으로 간주 될 것임을 의미합니다.

 false == 0;       // true
true == 1;        // true
true == "1";      // true
false == "";      // true

이 예에서, false는 0 만큼 동일하게 판단되므로 array_diff () 에 의해 결과에서 제외됩니다.

3. 부울 값은 자동으로 유형으로 변환됩니다.

또 다른 세부 사항은 Array_Diff () 에 의해 반환 된 배열이 숫자 값의 배열이고 PHP는 일부 경우 부울 값을 암시 적으로 변환한다는 것입니다. 예를 들어:

 var_dump(true);  // 산출 bool(true)
echo true;       // 산출 1

print_r () 에서 출력되면 부울 참이 1 으로 변환됩니다. 그렇기 때문에 결과에 1 명이 나타나지 않을 것입니다 .

4.이 문제를 피하는 방법은 무엇입니까?

데이터 유형을 비교 해야하는 경우 (예 : True1을 실제로 구별 해야하는 경우) Array_udiff ()를 사용하고 사용자 정의 비교 함수와 협력 할 수 있습니다.

 $a = [true, false];
$b = [0];

$result = array_udiff($a, $b, function($x, $y) {
    return ($x === $y) ? 0 : 1;
});

print_r($result);

산출:

 Array
(
    [0] => 1
    [1] => 
)

합동 비교 ===를 사용했기 때문에 False (해당 값이 비어 있음)도 보존됩니다.

이 값을보다 명확하게 구별하고 부울 유형의 표현을 보존 해야하는 경우 var_export ()를 결합하여 결과를 출력 할 수 있습니다.

 var_export($result);

5. 결론 :주의를 기울이고 엄격한 비교가 아닙니다

Array_Diff () 의 기본 동작은 많은 시나리오에서 매우 효율적이지만 부울 값, 숫자 및 문자열의 배열을 다룰 때 혼란스러운 결과를 얻을 수 있습니다. 이것은 또한 PHP의 유형 약화로 인한 전형적인 트랩입니다.

개발 중에 데이터 유형에 대한 엄격한 요구 사항이있는 경우 Default Array_Diff ()를 사용하지 말고 대신 Array_Udiff ()를 사용하고 자신의 비교 기능을 제공하면 더 안전하고 신뢰할 수있는 접근 방식입니다.