개발.이산이다

array_intersect_ukey

이산이다 2025. 12. 18. 01:20

✅ 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