개발.이산이다

array_udiff

이산이다 2025. 12. 17. 01:14

1. PHP array_udiff 함수 설명

array_udiff() 함수는 사용자 정의 비교 함수를 이용하여 배열 간의 차이(diff)를 구하는 함수입니다.
요소 값(value)을 기준으로 비교하며, 비교 로직은 사용자가 제공하는 콜백 함수에서 처리합니다.

✔ 특징

  • 키(key)는 비교에 사용하지 않고, 값(value)만 비교함.
  • 비교 함수는 두 값을 받아 0, 양수, 음수를 반환해야 함 (strcmp 스타일).
  • 첫 번째 배열에서, 다른 배열들과 비교 후 존재하지 않는 값만 반환.

2. PHP array_udiff 샘플 코드

 
<?php
function customCompare($a, $b) {
    return strcmp($a, $b);  // 문자열 비교
}

$array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["Banana", "Dragonfruit"];
$array3 = ["Cherry", "Elderberry"];

$result = array_udiff($array1, $array2, $array3, "customCompare");

print_r($result);
?>

3. 샘플 코드 설명 및 Output

✔ 동작 설명

  • array1에서 array2, array3에 존재하는 값은 제거
  • 사용자 정의 비교 함수 customCompare로 문자열 비교 수행

✔ 비교 결과

  • "Banana" → array2에 있음 → 제거
  • "Cherry" → array3에 있음 → 제거
  • "Apple" → 어느 배열에도 없음 → 유지됨

✔ Output

 
Array ( [0] => Apple )

4. VB.NET에서 유사 기능 구현 (array_udiff 대체)

VB.NET에는 PHP처럼 배열 차이를 사용자 정의 비교 함수로 처리하는 내장 함수가 없으나,
LINQ와 사용자 정의 Comparer를 이용해 동일한 기능을 구현할 수 있습니다.


✔ 4-1. VB.NET equivalent 설명

  • 두 배열을 비교하여 첫 번째 배열에만 존재하는 요소를 반환
  • 문자열 비교 또는 사용자 지정 비교 가능

✔ 4-2. VB.NET 샘플 코드

 
Imports System.Collections.Generic

Module Module1
    Class CustomComparer
        Implements IEqualityComparer(Of String)

        Public Function Equals(x As String, y As String) As Boolean Implements IEqualityComparer(Of String).Equals
            Return String.Compare(x, y, StringComparison.Ordinal) = 0
        End Function

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

    Sub Main()
        Dim array1 = {"Apple", "Banana", "Cherry"}
        Dim array2 = {"Banana", "Dragonfruit"}
        Dim array3 = {"Cherry", "Elderberry"}

        Dim comparer As New CustomComparer()

        Dim diff = array1.Except(array2, comparer).Except(array3, comparer)

        For Each item In diff
            Console.WriteLine(item)
        Next
    End Sub
End Module

✔ 4-3. Output

 
Apple

5. C#에서 유사 기능 구현 (array_udiff 대체)

C#도 VB.NET과 동일하게 LINQ의 Except()와 사용자 정의 비교자를 사용합니다.


✔ 5-1. 설명

  • IEqualityComparer<T> 구현하여 사용자 정의 비교 가능
  • 첫 번째 배열에서 나머지 배열에 없는 값을 반환

✔ 5-2. C# 샘플 코드

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

class CustomComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        return string.Compare(x, y, StringComparison.Ordinal) == 0;
    }

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

class Program
{
    static void Main()
    {
        string[] array1 = { "Apple", "Banana", "Cherry" };
        string[] array2 = { "Banana", "Dragonfruit" };
        string[] array3 = { "Cherry", "Elderberry" };

        var comparer = new CustomComparer();

        var result = array1.Except(array2, comparer).Except(array3, comparer);

        foreach (var item in result)
            Console.WriteLine(item);
    }
}

✔ 5-3. Output

 
Apple

6. Python에서 유사 기능 구현

Python은 set을 사용하면 유사한 기능을 구현할 수 있지만, 사용자 정의 비교 함수는 set에서 직접 지원하지 않음.
그래서 사용자 정의 비교가 필요하면 수동 필터링 방식으로 구현합니다.


✔ 6-1. 설명

  • 두 리스트의 차이를 구함
  • 문자열 비교 또는 사용자 정의 비교 적용 가능

✔ 6-2. Python 샘플 코드

 
def custom_compare(a, b):
    return a == b

def array_udiff_py(array1, *others):
    result = []
    for item in array1:
        exists = False
        for arr in others:
            if any(custom_compare(item, x) for x in arr):
                exists = True
                break
        if not exists:
            result.append(item)
    return result

array1 = ["Apple", "Banana", "Cherry"]
array2 = ["Banana", "Dragonfruit"]
array3 = ["Cherry", "Elderberry"]

print(array_udiff_py(array1, array2, array3))

✔ 6-3. Output

 
['Apple']

7. JavaScript에서 유사 기능 구현

JavaScript도 사용자 정의 비교 함수를 이용해 diff 기능을 직접 구현해야 합니다.


✔ 7-1. 설명

  • 배열 요소 비교시 콜백을 사용하여 커스텀 비교 가능
  • 첫 번째 배열에서 나머지 배열에 없는 요소만 반환

✔ 7-2. JavaScript 샘플 코드

 
function customCompare(a, b) {
    return a === b;
}

function array_udiff_js(array1, ...others) {
    return array1.filter(item => {
        return !others.some(arr =>
            arr.some(x => customCompare(item, x))
        );
    });
}

const array1 = ["Apple", "Banana", "Cherry"];
const array2 = ["Banana", "Dragonfruit"];
const array3 = ["Cherry", "Elderberry"];

console.log(array_udiff_js(array1, array2, array3));

✔ 7-3. Output

 
["Apple"]