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
)
'PHP' 카테고리의 다른 글
| [PHP] Traits (트레이트) - 코드를 재사용하는 방법 (0) | 2025.11.17 |
|---|---|
| [PHP] Secure Password Hashing - password_hash()로 비밀번호 저장 (0) | 2025.11.10 |
| [PHP] array_merge와 + 연산자로 두 배열 합치기의 차이점 (0) | 2025.11.09 |
| [PHP] usort()로 '사용자 목록'을 '나이 순'으로 정렬 (0) | 2025.11.06 |
| [PHP] NumberFormatter로 '2000000'을 '이백만'으로 변환하기 (0) | 2025.11.05 |