Array_Diff () 는 배열 간의 차이를 계산하는 PHP에서 매우 일반적인 기능입니다. 간단히 말해서, 첫 번째 배열에는 존재하지만 다른 배열에는없는 요소를 반환합니다. 그러나 array_diff () 함수는 비교를 수행 할 때 사례에 민감합니다. 즉, 두 배열의 문자열이 동일하지만 상단 및 하위 케이스가 다른 경우 Array_Diff () 는 다른 요소로 간주됩니다.
배열 차이 계산을 수행 할 때 케이스를 무시하려면 Array_Diff ()를 직접 사용하면 예상치 못한 결과가 발생합니다. 예를 들어, 두 개의 배열이 있다고 가정합니다. 그 중 하나는 상단 및 하위 케이스가 다른 문자열을 포함한다고 가정합니다.
$array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["apple", "banana", "cherry"];
$result = array_diff($array1, $array2);
print_r($result);
출력 결과는 다음과 같습니다.
Array
(
[0] => Apple
[1] => Banana
[2] => Cherry
)
이 코드는 array_diff ()가 콘텐츠가 동일하지만 "Apple" 과 "Apple" 이라고 생각한다는 것을 보여줍니다. Array_Diff () 는 기본적으로 사례에 민감하기 때문에 두 문자열의 내용이 동일하더라도 사례가 다르면 여전히 다른 요소로 간주됩니다.
실제 개발에서 문자열에는 사용자 입력, 데이터베이스 저장 필드 또는 URL 주소와 같은 혼합 케이스가 포함 된 상황에 종종 발생합니다. 이러한 혼합 케이스 문자열을 비교 해야하는 경우 array_diff ()는 부정확 한 결과를 초래할 수 있습니다.
예를 들어:
$array1 = ["https://example.com/Page", "https://m66.net/Home"];
$array2 = ["https://m66.net/home", "https://example.com/page"];
$result = array_diff($array1, $array2);
print_r($result);
출력 결과는 다음과 같습니다.
Array
(
[0] => https://example.com/Page
[1] => https://m66.net/Home
)
이 두 URL의 실제 내용은 동일하지만 Array_Diff ()는 다른 경우에 따라 다르다고 잘못 판단합니다.
위에서 언급 한 사례 민감도 문제를 해결하려면 몇 가지 추가 단계를 수행해야합니다. 가능한 해결책은 다음과 같습니다.
일반적인 솔루션은 배열의 모든 문자열을 균일 케이스 (소문자 또는 대문자)로 변환 한 다음 Array_Diff () 계산을 수행하는 것입니다. 이것은 비교할 때 사례가 무시되도록합니다.
$array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["apple", "banana", "cherry"];
$array1_lower = array_map('strtolower', $array1);
$array2_lower = array_map('strtolower', $array2);
$result = array_diff($array1_lower, $array2_lower);
print_r($result);
출력 결과 :
Array
(
)
이러한 방식으로 처리 한 후 Array_diff ()는 "Apple" 과 "Apple" 이 동일하다고 생각하고 결국 빈 배열을 반환하여 차이가 없음을 나타냅니다.
보다 복잡한 비교 규칙이 필요한 경우 array_udiff ()를 사용하여 사용자 정의 비교 함수를 전달하여 비교시 케이스 문제를 처리 할 수 있습니다. 간단한 예는 다음과 같습니다.
function caseInsensitiveCompare($a, $b) {
return strcasecmp($a, $b);
}
$array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["apple", "banana", "cherry"];
$result = array_uDiff($array1, $array2, "caseInsensitiveCompare");
print_r($result);
출력 결과 :
Array
(
)
여기서 우리는 strcasecmp () 함수를 사용하여 사례 비교를 효과적으로 피할 수있는 경우의 비교를 비교할 수 있습니다.
URL을 비교하고 케이스, 특히 도메인 이름 부분을 무시하려면 PHP의 내장 Parse_url () 함수를 사용하여 URL을 구문 분석 한 다음 도메인 이름 부분의 경우를 균일하게 변환 할 수 있습니다. 예를 들어:
function normalize_url($url) {
$parsed_url = parse_url($url);
$parsed_url['host'] = strtolower($parsed_url['host']);
return $parsed_url['scheme'] . '://' . $parsed_url['host'] . $parsed_url['path'];
}
$array1 = ["https://example.com/Page", "https://m66.net/Home"];
$array2 = ["https://m66.net/home", "https://example.com/page"];
$array1_normalized = array_map('normalize_url', $array1);
$array2_normalized = array_map('normalize_url', $array2);
$result = array_diff($array1_normalized, $array2_normalized);
print_r($result);
출력 결과 :
Array
(
)
도메인 이름을 소문자로 균일하게 변환하면 대문자와 소문자 케이스로 인해 잘못된 비교를 피할 수 있습니다.