현재 위치: > 최신 기사 목록> 메모 array_diff ()를 사용할 때

메모 array_diff ()를 사용할 때

M66 2025-06-06

PHP에서 Array_Diff ()는 배열 간의 차이를 찾을 수있는 매우 일반적인 기능입니다. 그러나 실제 프로젝트에서 연관 배열을 처리하기 위해이를 사용하면 작동 방식을 이해하지 못하면 많은 "구덩이"에 속할 수 있습니다.

이 기사에서는 Array_diff () 의 동작, 일반적인 오해 및 연관 배열 처리의 실용적인 기술을 심층적으로 설명합니다.

1. array_diff () 의 기본 사용

 $array1 = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry'];
$array2 = ['a' => 'apple', 'b' => 'blueberry'];

$result = array_diff($array1, $array2);
print_r($result);

산출:

 Array
(
    [b] => banana
    [c] => cherry
)

설명 : Array_Diff ()는 "값"만 비교하고 키 이름을 무시합니다 . 이 예에서 $ array1 [ 'b'] = 'banana' 의 키는 $ array2 [ 'b'] = 'blueberry' , 'banana' 는 다른 값으로 인한 차이점 중 하나와 동일하지만 다른 값으로 간주됩니다.

2. 일반적인 오해와 함정

1. 키 이름의 비교를 무시하십시오

오해 : 많은 개발자들은 array_diff () 가 키 값 쌍을 비교할 것이라고 생각합니다.

 $a = ['id' => 1, 'name' => 'John'];
$b = ['name' => 'John', 'id' => 2];

var_dump(array_diff($a, $b));

산출:

 array(1) {
  ["id"]=>
  int(1)
}

'name'=> 'john' 은 두 배열에서 동일하지만 array_diff ()는 키를 보지 않기 때문에 값이 존재하는지 여부에만 초점을 맞 춥니 다. 따라서 'ID'=> 1은 1이 $ b 의 값에 있지 않기 때문에 다른 것으로 간주됩니다.

? 솔루션 : 키와 값을 동시에 비교하려면 Array_Diff_Assoc ()를 사용하는 것이 좋습니다.

 array_diff_assoc($a, $b);

키와 값을 동시에 비교 하여이 "환상"을 피할 수 있습니다.

2. 데이터 유형의 비교를 무시하십시오

 $a = ['value1' => 123];
$b = ['value2' => '123'];

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

산출:

 Array
(
)

구덩이 포인트 : Array_diff ()는 옳고 그름을 엄격하게 비교하여 ( == ), 123'123'은 동일하게 간주됩니다.

? 팁 : 엄격한 비교가 필요한 경우 (값과 유형은 일관성이 있어야 함), 사용자 정의 비교 함수와 함께 array_diff () 의 variant array_diff_uassoc ()를 사용할 수 있습니다.

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

3. 다차원 배열을 처리 할 때 오류 기대

Array_diff ()1 차원 배열 도구 이며 다차원 배열의 경우 재귀 적으로 비교하지 않습니다.

 $a = ['info' => ['id' => 1, 'name' => 'Tom']];
$b = ['info' => ['id' => 1, 'name' => 'Tom']];

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

산출:

 Array
(
    [info] => Array
        (
            [id] => 1
            [name] => Tom
        )
)

원인 : 배열 유형의 값은 array_diff () 의 문자열로 취급되며 두 배열의 내용이 동일한 지 직접 비교할 수 없습니다.

? 솔루션 : 다차원 배열을 비교하려면 재귀 함수를 수동으로 작성하거나 직렬화 변환과 비교해야합니다.

 $a_serialized = array_map('serialize', $a);
$b_serialized = array_map('serialize', $b);

$diff = array_diff($a_serialized, $b_serialized);

3. 실용 기술 및 응용 시나리오

시나리오 1 : 데이터베이스 데이터가 수정되었는지 확인

데이터베이스에서 $ 원본 으로 데이터를 가져 오면 사용자가 양식을 $ new_data 에 제출하고 어떤 필드가 변경되었는지 알고 싶습니다.

 $original = ['name' => 'Alice', 'email' => 'a@m66.net'];
$new_data = ['name' => 'Alice', 'email' => 'alice@m66.net'];

$changed = array_diff_assoc($new_data, $original);

이렇게하면 사용자가 변경 한 필드를 정확하게 얻을 수 있습니다.

시나리오 2 : 두 구성 파일의 차이점 비교

두 개의 구성 배열 $ config1$ config2가 있습니다.

 $config1 = include 'http://m66.net/config/old.php';
$config2 = include 'http://m66.net/config/new.php';

$diff = array_diff_assoc($config2, $config1);

이를 통해 구성 변경에 쉽게 액세스 할 수 있으며 특히 자동 스크립트로 작성하는 데 적합합니다.

요약

방법 내용을 비교하십시오 유형을 구별할지 여부 장면에 적합합니다
Array_diff () 값 만 비교하십시오 아니요 간단한 가치 비교
Array_Diff_Assoc () 값 + 키 이름을 비교하십시오 아니요 양식, 구성 비교
Array_udiff () 사용자 정의 비교 방법 사용자 정의 가능 엄격한 유형 비교
Serialize + array_diff () 다차원 배열 비교 아니요 (확장 가능) 다차원 구조 비교

Array_Diff ()를 사용할 때 비교하는 내용에 대해 명확하게하십시오. 키 이름으로 오해하지 말고 유형의 영향을 잊지 마십시오. 이러한 원칙을 이해 함으로써만이 도구 기능을 사용할 수 있습니다.

프로젝트에서 특별한 비교 요구가 발생하면 가제트 함수 캡슐화 로직을 직접 작성하십시오. 이는 코드의 가독성을 향상시킬뿐만 아니라 구덩이에 침입 할 확률을 줄입니다.