기술.이산이다

array_diff_uassoc

이산이다 2025. 12. 7. 04:16

1. PHP array_diff_uassoc 함수 설명

array_diff_uassoc 함수는 두 배열을 비교할 때 키(key)를 사용자 정의 비교 함수로 비교하여,
첫 번째 배열에서 차이값만 반환하는 함수입니다.

  • 값(value)은 일반 비교로 비교
  • 키(key)는 사용자 정의 함수를 통해 비교
  • 반환값은 첫 번째 배열에만 존재하는 요소들

2. PHP 샘플 코드 (array_diff_uassoc)

 
<?php function keyCompare($a, $b) { if ($a === $b) return 0; return ($a > $b) ? 1 : -1; } $array1 = ["a" => "Apple", "b" => "Banana", "c" => "Cherry"]; $array2 = ["a" => "Apple", "b" => "Blueberry", "d" => "Durian"]; $result = array_diff_uassoc($array1, $array2, "keyCompare"); print_r($result); ?>
<?php
function keyCompare($a, $b) {
    if ($a === $b) return 0;
    return ($a > $b) ? 1 : -1;
}

$array1 = ["a" => "Apple", "b" => "Banana", "c" => "Cherry"];
$array2 = ["a" => "Apple", "b" => "Blueberry", "d" => "Durian"];

$result = array_diff_uassoc($array1, $array2, "keyCompare");

print_r($result);
?>

3. 샘플 코드 이용 방법 및 Output

✔ 사용 방법

  • array_diff_uassoc($array1, $array2, "비교함수")
  • $array1 기준으로 $array2에 같은 키가 없는 요소만 반환함.
  • 키 비교 시 keyCompare() 함수가 동작.

✔ 예상 출력 결과

 
Array ( [c] => Cherry )

이유:

  • "a" 키는 두 배열 모두 있으므로 제외
  • "b" 키는 두 배열 모두 있으므로 제외 (값은 다르지만 값 비교는 diff 기준 아님)
  • "c" 키는 $array2에 없으므로 결과에 포함됨

🔵 4. VB.NET 유사 기능 구현 (Except + 사용자 정의 키 비교 구현)

VB.NET에는 PHP의 array_diff_uassoc와 동일한 기능은 없지만,
Dictionary 비교 + 사용자 정의 키 비교 로직으로 유사하게 구현할 수 있습니다.


✔ VB.NET 함수 설명

두 Dictionary를 비교하여,
첫 번째 Dictionary에만 존재하는 Key-Value 쌍을 반환하는 사용자 정의 함수.


✔ VB.NET 샘플 코드

Function ArrayDiffUAssoc(dict1 As Dictionary(Of String, String),
                         dict2 As Dictionary(Of String, String),
                         keyCompare As Func(Of String, String, Integer)) As Dictionary(Of String, String)

    Dim result As New Dictionary(Of String, String)

    For Each kv In dict1
        Dim found As Boolean = False

        For Each kv2 In dict2
            If keyCompare(kv.Key, kv2.Key) = 0 Then
                found = True
                Exit For
            End If
        Next

        If Not found Then
            result.Add(kv.Key, kv.Value)
        End If
    Next

    Return result
End Function

Function KeyCompare(a As String, b As String) As Integer
    Return String.Compare(a, b)
End Function

Sub Main()
    Dim d1 = New Dictionary(Of String, String) From {
        {"a", "Apple"}, {"b", "Banana"}, {"c", "Cherry"}
    }

    Dim d2 = New Dictionary(Of String, String) From {
        {"a", "Apple"}, {"b", "Blueberry"}, {"d", "Durian"}
    }

    Dim result = ArrayDiffUAssoc(d1, d2, AddressOf KeyCompare)

    For Each kv In result
        Console.WriteLine($"{kv.Key} => {kv.Value}")
    Next
End Sub

✔ VB.NET 출력 결과

 
c => Cherry

🟢 5. C# 유사 기능 구현


✔ C# 함수 설명

PHP 함수와 동일하게,
첫 번째 Dictionary에서 두 번째 Dictionary의 키와 일치하지 않는 요소만 반환.


✔ C# 샘플 코드

 
using System;
using System.Collections.Generic;

class Program
{
    static int KeyCompare(string a, string b)
    {
        return string.Compare(a, b);
    }

    static Dictionary<string, string> ArrayDiffUAssoc(
        Dictionary<string, string> dict1,
        Dictionary<string, string> dict2,
        Func<string, string, int> comparer)
    {
        var result = new Dictionary<string, string>();

        foreach (var kv in dict1)
        {
            bool found = false;

            foreach (var kv2 in dict2)
            {
                if (comparer(kv.Key, kv2.Key) == 0)
                {
                    found = true;
                    break;
                }
            }

            if (!found)
                result.Add(kv.Key, kv.Value);
        }

        return result;
    }

    static void Main()
    {
        var d1 = new Dictionary<string, string> {
            {"a", "Apple"}, {"b", "Banana"}, {"c", "Cherry"}
        };

        var d2 = new Dictionary<string, string> {
            {"a", "Apple"}, {"b", "Blueberry"}, {"d", "Durian"}
        };

        var result = ArrayDiffUAssoc(d1, d2, KeyCompare);

        foreach (var kv in result)
            Console.WriteLine($"{kv.Key} => {kv.Value}");
    }
}

✔ C# 출력 결과

 
c => Cherry

🟠 6. Python 유사 기능 (dict 비교 + custom key comparator)

Python에는 PHP와 동일한 함수는 없으나,
사용자 정의 비교 함수를 사용하여 키 비교 기반 dict 차집합 구현이 가능함.


✔ Python 함수 설명

첫 번째 dict 기준으로,
두 번째 dict에 사용자 정의 키 비교로 일치하는 키가 없으면 결과에 포함.


✔ Python 샘플 코드

 
def key_compare(a, b):
    return (a > b) - (a < b)

def array_diff_uassoc(dict1, dict2, comparer):
    result = {}

    for k, v in dict1.items():
        found = False
        for k2 in dict2.keys():
            if comparer(k, k2) == 0:
                found = True
                break
        if not found:
            result[k] = v

    return result

d1 = {"a": "Apple", "b": "Banana", "c": "Cherry"}
d2 = {"a": "Apple", "b": "Blueberry", "d": "Durian"}

result = array_diff_uassoc(d1, d2, key_compare)
print(result)

✔ Python 출력 결과

 
{'c': 'Cherry'}

🟡 7. JavaScript 유사 기능 구현

JavaScript에는 PHP처럼 배열 키 기반 비교는 없지만,
객체(Object) 또는 Map을 이용하여 동일 기능 구현 가능.


✔ JavaScript 함수 설명

커스텀 키 비교 함수를 사용하여,
첫 번째 객체에만 존재하는 키를 반환.


✔ JavaScript 샘플 코드

 
function keyCompare(a, b) {
    if (a === b) return 0;
    return a > b ? 1 : -1;
}

function arrayDiffUAssoc(obj1, obj2, comparer) {
    const result = {};

    for (const key1 in obj1) {
        let found = false;

        for (const key2 in obj2) {
            if (comparer(key1, key2) === 0) {
                found = true;
                break;
            }
        }

        if (!found) {
            result[key1] = obj1[key1];
        }
    }

    return result;
}

const o1 = { a: "Apple", b: "Banana", c: "Cherry" };
const o2 = { a: "Apple", b: "Blueberry", d: "Durian" };

console.log(arrayDiffUAssoc(o1, o2, keyCompare));

✔ JavaScript 출력 결과

 
{ c: 'Cherry' }

🎉 전체 요약

PHP 원본 함수 제공 array_diff_uassoc
VB.NET 없음 → 직접 구현 Dictionary 비교 + 커스텀 키 비교
C# 없음 → 직접 구현 Dictionary 비교 + 커스텀 키 비교
Python 없음 → 직접 구현 dict 비교 + 사용자 정의 comparator
JavaScript 없음 → 직접 구현 Object 비교 + key comparator