PHP에서 Array_Diff ()는 배열 간의 차이를 찾을 수있는 매우 일반적인 기능입니다. 그러나 실제 프로젝트에서 연관 배열을 처리하기 위해이를 사용하면 작동 방식을 이해하지 못하면 많은 "구덩이"에 속할 수 있습니다.
이 기사에서는 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' 는 다른 값으로 인한 차이점 중 하나와 동일하지만 다른 값으로 간주됩니다.
오해 : 많은 개발자들은 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);
키와 값을 동시에 비교 하여이 "환상"을 피할 수 있습니다.
$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);
});
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);
데이터베이스에서 $ 원본 으로 데이터를 가져 오면 사용자가 양식을 $ new_data 에 제출하고 어떤 필드가 변경되었는지 알고 싶습니다.
$original = ['name' => 'Alice', 'email' => 'a@m66.net'];
$new_data = ['name' => 'Alice', 'email' => 'alice@m66.net'];
$changed = array_diff_assoc($new_data, $original);
이렇게하면 사용자가 변경 한 필드를 정확하게 얻을 수 있습니다.
두 개의 구성 배열 $ 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 ()를 사용할 때 비교하는 내용에 대해 명확하게하십시오. 키 이름으로 오해하지 말고 유형의 영향을 잊지 마십시오. 이러한 원칙을 이해 함으로써만이 도구 기능을 사용할 수 있습니다.
프로젝트에서 특별한 비교 요구가 발생하면 가제트 함수 캡슐화 로직을 직접 작성하십시오. 이는 코드의 가독성을 향상시킬뿐만 아니라 구덩이에 침입 할 확률을 줄입니다.