현재 위치: > 최신 기사 목록> array_diff_assoc ()를 사용할 때 일관되지 않은 배열 키 이름 유형을 유발하는 문제는 무엇입니까?

array_diff_assoc ()를 사용할 때 일관되지 않은 배열 키 이름 유형을 유발하는 문제는 무엇입니까?

M66 2025-05-13

Array_Diff_Assoc () 함수는 PHP에서 두 개 이상의 배열을 비교하는 데 사용되는 요소이며 첫 번째 어레이에는 존재하지만 다른 배열에는 존재하지 않는 요소가 포함 된 배열을 반환합니다. Array_Diff () 함수와 달리 Array_Diff_Assoc ()는 배열의 키 이름과 키 값을 동시에 비교합니다. 키 이름과 키 값이 모두 일치하면 제외됩니다.

그러나 실제 개발에서 키 이름 유형의 배열이 일치하지 않으면 Array_Diff_Assoc ()를 사용하면 예기치 않은 동작이 발생할 수 있습니다. 이 기사에서는 일관되지 않은 배열 키 이름 유형이 문제를 일으킬 수있는 이유를 논의하고이를 피할 수있는 몇 가지 솔루션을 제공합니다.

어레이에서 일관성없는 키 이름 문제

PHP는 약하게 입력 한 언어이므로 자동으로 유형을 변환합니다. 예를 들어, 어레이의 키 이름 1 (정수) 및 '1' (문자열)은 비교할 때 동일합니다. 이 자동 변환은 일관되지 않은 배열 키 이름 유형을 유발할 수 있으므로 Array_Diff_Assoc ()를 사용할 때 오류가 발생합니다.

다음 코드를 고려하십시오.

 <?php
$array1 = array(1 => 'apple', '1' => 'orange');
$array2 = array(1 => 'banana', '1' => 'orange');

$result = array_diff_assoc($array1, $array2);
print_r($result);
?>

이 예에서 $ array1$ array2는 모두 주요 이름 1'1'을 포함합니다. PHP는 '1'을 자동으로 정수 1 으로 변환하기 때문에이 두 가지 키 이름은 동일하게 간주됩니다. 따라서 Array_diff_assoc ()는 이 두 배열의 주요 값이 정확히 동일하며 실제로는 다르다고 생각합니다.

문제가 발생하는 이유는 무엇입니까?

  1. 키 이름 비교 규칙 : Array_Diff_Assoc () 는 배열의 값을 비교할뿐만 아니라 키 이름을 비교합니다. PHP는 키 이름을 비교할 때 엄격하므로 다른 키 이름 유형이 배열의 비교 결과에 영향을 미칩니다.

  2. 자동 유형 변환 : PHP가 비교할 때 자동 유형 변환을 수행하기 때문에 키 이름 유형 (예 : 1'1' )의 차이는 무시되어 예기치 않은 동작으로 이어질 수 있습니다. 예를 들어, 위의 예에서는 array_diff_assoc () 결과가 빈 배열입니다. 1'1'은 동일하게 간주되기 때문입니다.

  3. 디버그 오류 : 이러한 유형의 불일치는 특히 대규모 응용 프로그램에서 즉시 나타나지 않을 수 있습니다. 이로 인해 프로그램이 잘못된 결과를 반환 할 수 있으며 일부 경우 감지하고 수정하기가 어렵습니다.

이 상황을 피하는 방법?

  1. 키 이름 유형을 명시 적으로 통합 : Array_Diff_Assoc ()를 사용하기 전에 배열의 키 이름 유형이 일관되어 있는지 확인하십시오. 모든 키 이름은 intval () 또는 strval () 함수를 사용하여 동일한 유형으로 변환 할 수 있습니다.

    예를 들어 모든 키 이름을 문자열로 변환합니다.

     <?php
    $array1 = array('1' => 'apple', 1 => 'orange');
    $array2 = array(1 => 'banana', '1' => 'orange');
    
    // 모든 키 이름을 문자열로 변환하십시오
    $array1 = array_map(function($key) { return strval($key); }, array_keys($array1));
    $array2 = array_map(function($key) { return strval($key); }, array_keys($array2));
    
    $result = array_diff_assoc($array1, $array2);
    print_r($result);
    ?>
    
  2. array_diff_assoc () 대신 array_diff () 를 사용하십시오 . 키 이름이 아닌 배열 값에만 관심이있는 경우 array_diff ()를 사용하는 것을 고려하십시오. Array_Diff ()는 배열의 주요 이름을 비교하지 않고 일관되지 않은 키 이름으로 인한 문제를 피할 수있는 값 만 비교합니다.

  3. 캐스팅 사용 : 경우에 따라 주조는 키 이름의 일관성을 보장하는 데 사용됩니다. 배열의 키 이름 유형은 (int) 또는 (문자열)을 사용하여 명시 적으로 변환 할 수 있습니다.

     <?php
    $array1 = array(1 => 'apple', '1' => 'orange');
    $array2 = array(1 => 'banana', '1' => 'orange');
    
    // 캐스트 키 이름은 정수입니다
    $array1 = array_map(function($key) { return (int) $key; }, array_keys($array1));
    $array2 = array_map(function($key) { return (int) $key; }, array_keys($array2));
    
    $result = array_diff_assoc($array1, $array2);
    print_r($result);
    ?>
    
  4. 배열의 키 이름 유형을 철저히 확인하십시오 . 배열 비교를 수행하기 전에 var_dump () 또는 gettype ()를 사용하여 배열의 키 이름 유형을 확인하여 동일했는지 확인할 수 있습니다.

     <?php
    var_dump(array_keys($array1));
    var_dump(array_keys($array2));
    ?>
    

이러한 측정을 통해 일관되지 않은 키 이름 유형으로 인해 Array_Diff_Assoc () 의 사용을 효과적으로 피할 수 있습니다.