개발.이산이다

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

'개발.이산이다' 카테고리의 다른 글

array_intersect_key  (0) 2025.12.20
array_intersect_ukey  (0) 2025.12.18
array_udiff  (0) 2025.12.17
array_intersect  (0) 2025.12.16
array_diff  (0) 2025.12.15