현재 위치: > 최신 기사 목록> Array_intersect_uassoc에서 다른 데이터 유형의 키를 처리하는 방법?

Array_intersect_uassoc에서 다른 데이터 유형의 키를 처리하는 방법?

gitbox 2025-05-26

php에서 array_intersect_uassoc () 는 강력하지만 오해 된 기능입니다. 여러 배열의 키와 값을 비교하고 사용자 정의 함수를 통해 키를 비교하여 교차로 부분을 반환하는 데 사용됩니다. 그러나 키를 비교하는 방식이 사용자 정의 될 수 있기 때문에 잠재적 인 문제가 발생할 수 있기 때문에 핵심 유형이 다르면 (예 : 문자열 및 정수와 같은) 비교가 정확한지 확인하는 방법은 무엇입니까?

array_intersect_uassoc의 기본 사용

array_intersect_uassoc () 의 기본 사용법을 빠르게 검토합시다.

 $result = array_intersect_uassoc(
    ['1' => 'apple', 2 => 'banana', 3 => 'cherry'],
    [1 => 'apple', '2' => 'banana', 3 => 'berry'],
    function ($a, $b) {
        return strcmp((string)$a, (string)$b);
    }
);
print_r($result);

이 예에서는 strcmp ()를 사용하여 키를 비교하고 키를 문자열로 명시 적으로 변환합니다. 이것은 다른 유형으로 인한 비교 실패를 피하기위한 것입니다.

주요 유형 문제의 핵심

PHP의 배열 키는 정수 또는 문자열 일 수 있으며 PHP는 특정 상황에서 자동으로 변환합니다. 예를 들어, '1'은 정수 1로 자동 변환됩니다.이 자동 변환은 대부분의 경우 문제를 일으키지 않지만 Array_Intersect_uassoc ()를 사용할 때는 문제가 발생할 수 있습니다.

  • '1'1은 정상 어레이에서 동일하게 간주 될 수 있지만 strcmp () 와 비교할 때 다릅니다.

  • PHP의 === 운영자는 유형과 값이 모두 같아야하므로 많은 개발자가 Array_Intersect_uassoc ()가 동일하게 수행한다고 생각하게합니다.

그러나 실제로 Array_intersect_uassoc ()는 전달한 비교 함수에 의존하므로 결과는 유형 변환 문제를 알고 있는지 여부에 따라 크게 의존합니다.

다양한 유형의 키를 처리하는 방법?

다른 유형으로 인한 비교 오류를 피하려면 다음 전략이 권장됩니다.

1. 명시 적 변환 키 유형

가장 안전한 방법은 키를 비교 함수에서 동일한 유형 (일반적으로 문자열 또는 정수)으로 수동으로 변환하는 것입니다.

 function normalize_key_compare($a, $b) {
    return strcmp((string)$a, (string)$b);
}

이렇게하면 '1'1이 동일한 키로 처리됩니다.

2. 일관된 배열을 사용하십시오

입력 데이터를 제어 할 수있는 경우 배열을 구성 할 때 키 유형을 통합하는 것이 가장 좋습니다. 예를 들어, 모든 키가 숫자인지 확인하는 경우 다음에 쓸 수 있습니다.

 $array1 = [
    1 => 'apple',
    2 => 'banana',
    3 => 'cherry'
];
$array2 = [
    1 => 'apple',
    2 => 'banana',
    3 => 'berry'
];

이런 식으로, 기본 strcmp () 비교기를 사용하더라도 유형 혼동을 유발하지 않습니다.

3. 연관 어레이에서 암시 적 변환을 조심하십시오

PHP는 '01'을 자동으로 정수 1로 변경합니다. 문자열 형식으로 키를 보존하려면 따옴표를 사용하고 암시 적 변환이 발생하지 않도록해야합니다.

 $array = [
    '01' => 'value'
];

그러나 일단 당신이 쓰면 :

 $array = [
    01 => 'value'
];

열쇠는 정수가됩니다 1.

실제 응용 시나리오

다른 소스의 두 개의 데이터 세트가 있다고 가정합니다. 하나는 JSON에서 디코딩하고 다른 하나는 데이터베이스에서 해독되었습니다. JSON의 키는 문자열 일 수 있고 데이터베이스의 키는 정수입니다.

 $jsonData = json_decode('{"1":"apple","2":"banana"}', true);
$dbData = [
    1 => 'apple',
    2 => 'banana',
    3 => 'cherry'
];

둘의 교차점을 찾고 싶다면 다음과 같이 처리 할 수 ​​있습니다.

 $result = array_intersect_uassoc(
    $jsonData,
    $dbData,
    function ($a, $b) {
        return strcmp((string)$a, (string)$b);
    }
);
print_r($result);

이 시점에서 출력은 다음과 같습니다.

 Array
(
    [1] => apple
    [2] => banana
)

요약

Array_Intersect_uassoc ()을 사용하는 경우 주요 비교 메커니즘과 유형 일관성의 중요성을 이해해야합니다. 몇 가지 주요 제안은 다음과 같습니다.

  • 항상 키 유형을 확인하십시오.

  • 비교 함수를 사용할 때 통합 유형;

  • 결과가 기대치를 충족하지 않으면 먼저 키의 유형 차이를 확인하십시오.

  • 가능하면 데이터 구조를 미리 정규화하십시오.

주요 유형의 올바른 처리는 잠재적 인 버그를 피할 수있을뿐만 아니라 PHP 유형 시스템에 대한 제어를 향상시킬 수 있습니다. PHP 배열 기능에 대한보다 실용적인 팁은 https://gitbox.net/php-array-utils를 방문하십시오.