✅ 1. PHP array_intersect_ukey 함수 설명
array_intersect_ukey() 함수는 키(key)를 기준으로 여러 배열의 교집합을 구하되, 키 비교를 사용자 정의 함수(콜백)로 수행합니다.
즉,
- 값(value) 은 비교하지 않고
- 키(key)만 사용자 정의 비교 함수(콜백)를 이용해 비교하여
- 모든 배열에 공통된 키를 포함하는 요소만 반환합니다.
✔ 함수 원형
array_intersect_ukey(array $array, array ...$arrays, callable $key_compare_func): array
✔ 특징
- 키 비교는 반드시 콜백 함수만 사용합니다.
- 콜백은 strcmp 형태:
return ($a <=> $b); 또는
return ($a == $b ? 0 : ($a > $b ? 1 : -1)); - 값이 아니라 "키"만 비교합니다.
✅ 2. PHP array_intersect_ukey 샘플 코드
<?php
function compareKeys($a, $b) {
return strcasecmp($a, $b); // 대소문자 구분 없이 비교
}
$arr1 = ["A" => 1, "b" => 2, "C" => 3];
$arr2 = ["a" => 10, "B" => 20, "D" => 40];
$result = array_intersect_ukey($arr1, $arr2, "compareKeys");
print_r($result);
?>
✅ 3. 샘플 코드 이용 방법 및 출력 결과
✔ 동작 설명
- $arr1의 키: A, b, C
- $arr2의 키: a, B, D
- compareKeys() 는 대소문자 무시 비교
- 공통 키(A=a, b=B)가 존재하므로 결과 배열은 다음과 같습니다.
✔ 출력 결과
Array ( [A] => 1 [b] => 2 )
✅ 4. VB.NET에서 유사한 기능 구현
VB.NET에는 PHP의 array_intersect_ukey 같은 내장 함수가 없으므로 Dictionary(Of TKey,TValue) + 사용자 정의 키 비교 방식으로 구현합니다.
✔ 4-1. VB.NET 함수 설명
- 두 개의 Dictionary에서
사용자 정의 키 비교 함수(delegate) 를 이용해
공통 키를 찾아냅니다. - 반환값은 공통 키만 포함한 Dictionary.
✔ 4-2. VB.NET 샘플 코드
Function IntersectUKey(Of TKey, TValue)(
dict1 As Dictionary(Of TKey, TValue),
dict2 As Dictionary(Of TKey, TValue),
comparer As Func(Of TKey, TKey, Boolean)
) As Dictionary(Of TKey, TValue)
Dim result As New Dictionary(Of TKey, TValue)()
For Each key1 In dict1.Keys
For Each key2 In dict2.Keys
If comparer(key1, key2) Then
result(key1) = dict1(key1)
End If
Next
Next
Return result
End Function
' 사용 예
Dim d1 As New Dictionary(Of String, Integer) From {{"A", 1}, {"b", 2}, {"C", 3}}
Dim d2 As New Dictionary(Of String, Integer) From {{"a", 10}, {"B", 20}, {"D", 40}}
Dim output = IntersectUKey(d1, d2, Function(a, b) a.Equals(b, StringComparison.OrdinalIgnoreCase))
✔ 4-3. 출력 결과
VB.NET에서 output Dictionary 의 내용:
A = 1 b = 2
✅ 5. C#에서 유사한 기능 구현
C#도 VB.NET과 동일하게, Dictionary + 사용자 정의 키 비교를 조합하여 구현합니다.
✔ 5-1. C# 함수 설명
- 키 비교를 delegate 또는 Func<TKey,TKey,bool>로 수행.
- 공통된 키를 Dictionary 형태로 반환.
✔ 5-2. C# 샘플 코드
using System;
using System.Collections.Generic;
Dictionary<string, int> IntersectUKey(
Dictionary<string, int> d1,
Dictionary<string, int> d2,
Func<string, string, bool> comparer)
{
var result = new Dictionary<string, int>();
foreach (var k1 in d1.Keys)
{
foreach (var k2 in d2.Keys)
{
if (comparer(k1, k2))
{
result[k1] = d1[k1];
}
}
}
return result;
}
// 사용 예시
var dict1 = new Dictionary<string, int> { ["A"] = 1, ["b"] = 2, ["C"] = 3 };
var dict2 = new Dictionary<string, int> { ["a"] = 10, ["B"] = 20, ["D"] = 40 };
var result = IntersectUKey(dict1, dict2,
(a, b) => string.Equals(a, b, StringComparison.OrdinalIgnoreCase));
✔ 5-3. 출력 결과
A : 1 b : 2
✅ 6. Python에서 유사 기능 구현
Python에서는 dictionary와 사용자 정의 함수로 키를 비교하여 교집합을 만듭니다.
✔ 6-1. Python 함수 설명
- 두 dict의 키를 사용자 정의 비교 함수로 비교하여 공통 키만 추출.
✔ 6-2. Python 샘플 코드
def intersect_ukey(dict1, dict2, compare):
result = {}
for k1 in dict1:
for k2 in dict2:
if compare(k1, k2):
result[k1] = dict1[k1]
return result
# 사용 예
d1 = {"A": 1, "b": 2, "C": 3}
d2 = {"a": 10, "B": 20, "D": 40}
result = intersect_ukey(d1, d2, lambda a, b: a.lower() == b.lower())
print(result)
✔ 6-3. 출력 결과
{'A': 1, 'b': 2}
✅ 7. JavaScript에서 유사 기능 구현
JS 역시 사용자 정의 콜백을 이용한 키 비교 함수를 직접 구현해야 합니다.
✔ 7-1. 함수 설명
- 객체(Object 또는 Map)의 키를 비교하여 교집합을 만듭니다.
- 콜백으로 키 비교 전략을 정의합니다.
✔ 7-2. JavaScript 샘플 코드
function intersectUKey(obj1, obj2, compareFunc) {
const result = {};
for (const k1 in obj1) {
for (const k2 in obj2) {
if (compareFunc(k1, k2)) {
result[k1] = obj1[k1];
}
}
}
return result;
}
const o1 = { A: 1, b: 2, C: 3 };
const o2 = { a: 10, B: 20, D: 40 };
const output = intersectUKey(o1, o2, (a, b) => a.toLowerCase() === b.toLowerCase());
console.log(output);
✔ 7-3. 출력 결과
{ A: 1, b: 2 }
📌 전체 요약
언어기능 제공 방식
| PHP | array_intersect_ukey 내장 기능 제공 |
| VB.NET / C# / Python / JS | 모두 직접 구현 필요 (Dictionary/Object + 사용자 정의 키 비교 함수) |
'개발.이산이다' 카테고리의 다른 글
| array_intersect_key (0) | 2025.12.20 |
|---|---|
| array_intersect_uassoc (0) | 2025.12.19 |
| array_udiff (0) | 2025.12.17 |
| array_intersect (0) | 2025.12.16 |
| array_diff (0) | 2025.12.15 |