개발.이산이다
array_intersect_uassoc
이산이다
2025. 12. 19. 01:23
✅ 1. PHP array_intersect_uassoc 함수 설명
array_intersect_uassoc 함수는 키와 값을 모두 비교하여 공통 요소를 찾되, 키 비교는 사용자 정의 콜백 함수로 수행하는 배열 교집합 함수입니다.
- 값 비교는 일반 비교(==)
- 키 비교는 직접 만든 콜백 함수 사용
- 배열의 키와 값이 모두 일치해야 교집합으로 인정
✔ 함수 원형
array_intersect_uassoc(array $array1, array $array2, callable $key_compare_func): array
✅ 2. PHP 샘플 코드 생성
<?php
$arr1 = ["a" => 1, "b" => 2, "c" => 3];
$arr2 = ["A" => 1, "b" => 2, "d" => 4];
// 사용자 정의 키 비교 함수 (대소문자 구분 없이 비교)
function keyCompare($key1, $key2) {
return strcasecmp($key1, $key2);
}
$result = array_intersect_uassoc($arr1, $arr2, "keyCompare");
print_r($result);
?>
✅ 3. 샘플 코드 이용 방법 및 Output 설명
✔ 동작 방식
- 값이 동일해야 하며 (==)
- 키는 strcasecmp 기반 비교 → 대소문자 구분 없이 같은 키로 간주
✔ 비교 결과
- "a" == "A" (키 비교 OK, 값도 1로 동일 → 포함)
- "b" == "b" (키/값 모두 동일 → 포함)
- "c"는 arr2에 없음
✔ 출력 결과
Array ( [a] => 1 [b] => 2 )
✅ 4. VB.NET 동일/유사 기능 구현
VB.NET에는 PHP의 array_intersect_uassoc 같은 내장 함수가 없으므로
Dictionary(Of TKey,TValue)와 사용자 정의 키 비교 기능을 이용해 직접 구현해야 합니다.
✔ 4-1. VB.NET 함수 설명
- 두 Dictionary의 키 비교는 사용자 정의 함수(delegate)
- 값 비교는 Equals
- 키와 값이 모두 같으면 결과에 포함
✔ 4-2. VB.NET 샘플 코드
Function ArrayIntersectUAssoc(
dict1 As Dictionary(Of String, Integer),
dict2 As Dictionary(Of String, Integer),
keyCompare As Func(Of String, String, Boolean)
) As Dictionary(Of String, Integer)
Dim result As New Dictionary(Of String, Integer)
For Each kv In dict1
For Each kv2 In dict2
If keyCompare(kv.Key, kv2.Key) AndAlso kv.Value = kv2.Value Then
result.Add(kv.Key, kv.Value)
End If
Next
Next
Return result
End Function
▶ 사용 예
Dim d1 = New Dictionary(Of String, Integer) From {{"a", 1}, {"b", 2}, {"c", 3}}
Dim d2 = New Dictionary(Of String, Integer) From {{"A", 1}, {"b", 2}, {"d", 4}}
Dim result = ArrayIntersectUAssoc(d1, d2,
Function(k1, k2) String.Compare(k1, k2, True) = 0)
For Each kv In result
Console.WriteLine($"{kv.Key} = {kv.Value}")
Next
✔ 4-3. VB.NET Output
a = 1 b = 2
✅ 5. C# 동일/유사 기능 구현
C#에도 동일한 기능이 없으므로 LINQ와 delegate를 사용하여 구현합니다.
✔ 5-1. C# 함수 설명
- 두 Dictionary<TKey, TValue> 비교
- 키 비교는 Func<string,string,bool>
- 값은 Equals 비교
✔ 5-2. C# 샘플 코드
Dictionary<string, int> ArrayIntersectUAssoc(
Dictionary<string, int> d1,
Dictionary<string, int> d2,
Func<string, string, bool> keyCompare)
{
var result = new Dictionary<string, int>();
foreach (var kv in d1)
{
foreach (var kv2 in d2)
{
if (keyCompare(kv.Key, kv2.Key) && kv.Value == kv2.Value)
{
result.Add(kv.Key, kv.Value);
}
}
}
return result;
}
▶ 사용 예
var d1 = new Dictionary<string, int> { {"a",1}, {"b",2}, {"c",3} };
var d2 = new Dictionary<string, int> { {"A",1}, {"b",2}, {"d",4} };
var result = ArrayIntersectUAssoc(d1, d2,
(k1, k2) => string.Equals(k1, k2, StringComparison.OrdinalIgnoreCase));
foreach (var kv in result)
Console.WriteLine($"{kv.Key} = {kv.Value}");
✔ 5-3. C# Output
a = 1 b = 2
✅ 6. Python 유사 기능 구현
Python에는 딕셔너리 교집합을 키 비교 커스터마이징 할 수 있는 내장 함수가 없으므로 직접 구현해야 합니다.
✔ 6-1. Python 함수 설명
- 두 dict 비교
- 키 비교는 콜백 함수로 수행
- 값은 == 비교
✔ 6-2. Python 샘플 코드
def array_intersect_uassoc(dict1, dict2, key_compare):
result = {}
for k1, v1 in dict1.items():
for k2, v2 in dict2.items():
if key_compare(k1, k2) and v1 == v2:
result[k1] = v1
return result
d1 = {"a": 1, "b": 2, "c": 3}
d2 = {"A": 1, "b": 2, "d": 4}
result = array_intersect_uassoc(d1, d2, lambda a, b: a.lower() == b.lower())
print(result)
✔ 6-3. Python Output
{'a': 1, 'b': 2}
✅ 7. JavaScript 유사 기능 구현
JS에도 동일 내장 기능이 없으므로 직접 구현합니다.
✔ 7-1. JavaScript 함수 설명
- 객체(object) 키 비교는 콜백으로 처리
- 값 비교는 ===
✔ 7-2. JavaScript 샘플 코드
function arrayIntersectUAssoc(obj1, obj2, keyCompare) {
const result = {};
for (const [k1, v1] of Object.entries(obj1)) {
for (const [k2, v2] of Object.entries(obj2)) {
if (keyCompare(k1, k2) && v1 === v2) {
result[k1] = v1;
}
}
}
return result;
}
const o1 = { a: 1, b: 2, c: 3 };
const o2 = { A: 1, b: 2, d: 4 };
const result = arrayIntersectUAssoc(o1, o2, (a, b) => a.toLowerCase() === b.toLowerCase());
console.log(result);
✔ 7-3. JavaScript Output
{ a: 1, b: 2 }
✅ 모든 언어에서 공통된 Output
a = 1 b = 2