개발.이산이다

array_diff_ukey

이산이다 2025. 12. 9. 05:22

1. PHP array_diff_ukey 함수 설명

array_diff_ukey() 함수는 사용자 정의 콜백 함수로 키 값을 비교하여 배열의 차집합을 구합니다.
즉, **비교 기준이 키(key)**이며, 키 비교 시 사용자가 정의한 비교 함수를 사용합니다.

✔ 동작 방식

array1의 각 키가 다른 배열(array2, array3, …)에는 존재하지 않을 때, 해당 요소를 결과 배열에 포함합니다.

✔ 함수 시그니처

 
array array_diff_ukey(array $array1, array $array2, callable $key_compare_func, array ...$arrays)

✔ 특징

  • 비교는 값(value)이 아니라 키(key) 로 수행된다.
  • 키 비교는 콜백 함수를 사용한다.
  • 콜백 함수는 strcmp 형태처럼 음수 / 0 / 양수를 반환해야 한다.

2. PHP array_diff_ukey 샘플 코드

 
<?php
function compareKeys($a, $b) {
    return strcmp($a, $b);
}

$array1 = [
    "apple" => 1,
    "banana" => 2,
    "cherry" => 3
];

$array2 = [
    "banana" => 8,
    "date" => 9
];

$result = array_diff_ukey($array1, $array2, "compareKeys");

print_r($result);
?>

3. 샘플 코드 설명 및 출력 결과

✔ 동작 설명

  • array1의 키들: apple, banana, cherry
  • array2의 키들: banana, date
  • banana는 양쪽 배열 모두에 존재하므로 제외됨
  • 남는 키: apple, cherry

✔ 출력 결과

 
Array ( [apple] => 1 [cherry] => 3 )

4. VB.NET 유사 기능 구현 (Except + Custom Comparer)

VB.NET에는 PHP의 array_diff_ukey와 동일한 내장 함수는 없습니다.
→ 대신 Dictionary의 키를 비교하여 차집합을 구하는 기능을 직접 구현해야 합니다.


✔ VB.NET 함수 설명 (유사 기능)

  • 두 개의 Dictionary를 받아 키를 비교하여 첫 번째 Dictionary에서만 존재하는 요소들을 반환.
  • 키 비교 방식은 사용자 정의 Comparer로 설정 가능.

✔ VB.NET 샘플 코드

 
Imports System.Collections.Generic

Module Module1

    Class KeyComparer
        Implements IEqualityComparer(Of String)

        Public Function Equals(x As String, y As String) As Boolean Implements IEqualityComparer(Of String).Equals
            Return x.ToLower() = y.ToLower()
        End Function

        Public Function GetHashCode(obj As String) As Integer Implements IEqualityComparer(Of String).GetHashCode
            Return obj.ToLower().GetHashCode()
        End Function
    End Class

    Sub Main()
        Dim dict1 As New Dictionary(Of String, Integer) From {
            {"apple", 1},
            {"banana", 2},
            {"cherry", 3}
        }

        Dim dict2 As New Dictionary(Of String, Integer) From {
            {"banana", 8},
            {"date", 9}
        }

        Dim comparer As New KeyComparer()

        Dim result = dict1.Where(Function(kv) Not dict2.Keys.Contains(kv.Key, comparer)).ToDictionary(Function(kv) kv.Key, Function(kv) kv.Value)

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

End Module

✔ VB.NET output

 
apple = 1 cherry = 3

5. C# 유사 기능 구현

C# 역시 array_diff_ukey와 동일한 내장 함수는 없으므로
Dictionary + Custom Comparer 방식으로 구현합니다.


✔ C# 함수 설명

  • Dictionary를 비교하여 첫 번째 Dictionary에만 존재하는 키를 반환.

✔ C# 샘플 코드

 
using System;
using System.Collections.Generic;
using System.Linq;

class KeyComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        return x.Equals(y, StringComparison.OrdinalIgnoreCase);
    }

    public int GetHashCode(string obj)
    {
        return obj.ToLower().GetHashCode();
    }
}

class Program
{
    static void Main()
    {
        var dict1 = new Dictionary<string, int>
        {
            { "apple", 1 },
            { "banana", 2 },
            { "cherry", 3 }
        };

        var dict2 = new Dictionary<string, int>
        {
            { "banana", 8 },
            { "date", 9 }
        };

        var comparer = new KeyComparer();

        var result = dict1
            .Where(kv => !dict2.Keys.Contains(kv.Key, comparer))
            .ToDictionary(kv => kv.Key, kv => kv.Value);

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

✔ C# 출력 결과

 
apple = 1 cherry = 3

6. Python 유사 기능 구현 (set + 키 비교)

Python에는 PHP의 array_diff_ukey와 비슷한 내장 함수는 없습니다.
→ 하지만 dict의 키를 비교하기 쉽기 때문에 동일 동작을 구현할 수 있습니다.


✔ Python 함수 설명

  • 첫 dict의 키 중 다른 dict에 없는 키만 추출

✔ Python 샘플 코드

 
dict1 = {
    "apple": 1,
    "banana": 2,
    "cherry": 3
}

dict2 = {
    "banana": 8,
    "date": 9
}

result = {k: v for k, v in dict1.items() if k not in dict2.keys()}

print(result)

✔ Python 출력 결과

 
{'apple': 1, 'cherry': 3}

7. JavaScript 유사 기능 구현

JavaScript에서는 Object 대신 Map을 사용하면 PHP 배열과 가장 유사하게 동작합니다.


✔ JavaScript 함수 설명

  • 두 Map 객체의 키를 비교하여 첫 번째 Map에서만 존재하는 항목 반환.

✔ JavaScript 샘플 코드

 
const map1 = new Map([
  ["apple", 1],
  ["banana", 2],
  ["cherry", 3]
]);

const map2 = new Map([
  ["banana", 8],
  ["date", 9]
]);

const result = new Map(
  [...map1].filter(([key]) => !map2.has(key))
);

console.log(result);

✔ JavaScript 출력 결과

 
Map(2) { 'apple' => 1, 'cherry' => 3 }

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

array_fill  (0) 2025.12.11
array_chunk  (0) 2025.12.10
date_diff  (0) 2025.12.10
GMT+9 기준으로 현재 날짜 구하기  (0) 2025.09.28
내서버에 웹셀( WebShell )이 있다? - 탐지방법  (0) 2025.09.28