본문 바로가기
PHP

[PHP] foreach 없이 두 배열의 '차이'와 '교집합' 찾기 array_diff(), array_intersect()

by teamnova 2025. 11. 12.
728x90

안녕하세요.

오늘은 foreach 없이 두 배열의 '차이'와 '교집합' 을 찾아보도록 하겠습니다. 

 

 

두 배열 간의 차이나, 교집합을 찾으려고 할 때 가장 단순한 방법은 foreach를 중첩해서 돌리는 것이지만,

이 방법은 코드가 10줄 이상으로 길어지고 데이터가 많아지면 성능이 급격하게 나빠집니다.

PHP는 '집합' 연산을 단 한 줄의 함수로 처리할 수 있는 내장 함수를 제공합니다.

array_diff($arr1, $arr2) (차집합)
- $arr1에는 있지만 $arr2에는 없는 요소들을 반환합니다.
- 주의: 순서가 중요합니다! array_diff(A, B)와 array_diff(B, A)는 완전히 다른 결과를 반환합니다.

array_intersect($arr1, $arr2) (교집합)
- $arr1과 $arr2 모두에 존재하는 공통 요소들을 반환합니다.


 

예제     

$old_users (어제 접속자)와 $current_users (오늘 접속자) 두 배열을 비교하여 "접속이 끊긴 사람", "새로 접속한 사람", "여전히 접속 중인 사람"을 찾아보겠습니다.                                                                                                                                                 

<?php

// 어제 접속했던 사용자 목록
$old_users = ['A', 'B', 'C', 'D'];

// 오늘 접속 중인 사용자 목록
$current_users = ['C', 'D', 'E'];

echo "--- 1. 접속이 끊긴 사용자 --- \n";
echo "('어제'는 있었지만 '오늘'은 없는 사람)\n";
$logged_out = array_diff($old_users, $current_users);
print_r($logged_out);


echo "\n--- 2. 새로 접속한 사용자 --- \n";
echo "('오늘'은 있지만 '어제'는 없었던 사람)\n";
$new_users = array_diff($current_users, $old_users);
print_r($new_users);


echo "\n--- 3. 여전히 접속 중인 사용자 (교집합) --- \n";
echo "('어제'도 있었고 '오늘'도 있는 사람)\n";
$still_in = array_intersect($old_users, $current_users);
print_r($still_in);

?>

                                                    

 

결과 

--- 1. 접속이 끊긴 사용자 --- 
('어제'는 있었지만 '오늘'은 없는 사람)
Array
(
    [0] => A
    [1] => B
)

--- 2. 새로 접속한 사용자 --- 
('오늘'은 있지만 '어제'는 없었던 사람)
Array
(
    [2] => E
)

--- 3. 여전히 접속 중인 사용자 (교집합) --- 
('어제'도 있었고 '오늘'도 있는 사람)
Array
(
    [2] => C
    [3] => D
)