정의 및 사용 방법
- PHP 버전
- 4.3+
array_diff_assoc() 함수는
키(Key)와 값(Value) 쌍을 기준으로 배열 간의 차이(difference)를 비교하여,
다른 배열에 없는 첫 번째 배열의 요소로 구성된 연관(associative) 배열을 반환합니다.
이 함수는 연관 배열에서 키(Key)와 값(Value) 쌍이 동시에 일치하는지를 기준으로,
다른 배열에 존재하지 않는 요소를 찾는 데 사용됩니다. 즉, 키와 값이 모두 같아야 일치하는 요소로 간주합니다.
이 특성을 활용하면, 특정 키와 값의 조합을 기준으로
연관 배열에서 제외해야 할 요소를 식별하는 데에도 사용할 수 있습니다.
주로 다음과 같은 용도로 사용됩니다.
- 다른 배열과 키(Key)와 값(Value) 쌍이 동일한 요소를 제외하기
- 연관 배열 간의 차이(difference)를 확인하기
- 특정 키와 값 쌍을 기준으로 연관 배열에서 요소를 제거하기
기본 예제
/* 다른 배열과 키(Key)와 값(Value) 쌍이 동일한 요소를 제외하기 */
$array1 = ['a' => 1, 'b' => 2, 'c' => 3]; // 비교 기준이 되는 배열
$array2 = ['b' => 2, 'c' => 3, 'd' => 4];
$result = array_diff_assoc($array1, $array2);
print_r($result); // Array ( [a] => 1 )
/* 연관 배열 간의 차이(difference) 확인 */
$current_user_info = ['id' => 1, 'name' => 'John', 'age' => 30];
$updated_user_info = ['id' => 1, 'name' => 'John', 'age' => 31];
$differences = array_diff_assoc($updated_user_info, $current_user_info);
if (!empty($differences)) {
echo '변경된 데이터가 있습니다. 변경된 정보: ';
foreach ($differences as $key => $value) {
echo "$key: $value ";
}
} else {
echo '변경된 데이터가 없습니다.';
}
// 출력: '변경된 데이터가 있습니다. 변경된 정보: age: 31'
/* 특정 키와 값 쌍을 기준으로 연관 배열에서 요소 제거 */
$original_array = ['id' => 1, 'name' => 'John', 'age' => 30];
$value_to_remove = 'John';
$result = array_diff_assoc($original_array, ['name' => $value_to_remove]);
print_r($result); // Array ( [id] => 1 [age] => 30 )
array_diff_assoc() 함수는 키(Key)와 값(Value) 쌍이 동시에 일치하는지를 기준으로 다른 배열에 없는 요소를 찾는 데 사용하지만,
array_diff() 함수는 키와는 무관하게 값만을 비교하여 다른 배열에 없는 값을 찾는데 사용합니다.
| 함수 | 차이점 |
|---|---|
array_diff_assoc() |
배열의 키와 값을 모두 비교합니다. |
array_diff() |
배열의 키를 고려하지 않고 값만 비교합니다. |
구문
array_diff_assoc(array $array_1, $array_2, $array_3, ...): array
매개변수
$array_1 |
필수. 비교 기준이 되는 배열입니다. |
|---|---|
$array_2 |
필수(PHP 8.0.0 버전부터는 옵션). 첫 번째 배열을 비교 대상으로 하는 배열입니다.
PHP 8.0.0 버전부터의 변경 사항을 참조하세요. |
$array_3, ... |
옵션. 첫 번째 배열을 비교 대상으로 하는 배열에 비교 대상을 더 추가한 배열로 여러 배열을 추가할 수 있습니다. |
반환 값
두 개 이상의 배열에서 키와 값 쌍이 동시에 일치하는지를 비교하여 차이를 체크해서, 다른 배열에 없고 첫 번째 배열에만 있는 키와 값 쌍으로 구성된 새로운 연관 배열을 반환합니다.
만약 키(Key)와 값(Value) 쌍을 기준으로 비교했을 때, 첫 번째 배열에만 존재하는 요소가 없다면 빈 배열을 반환합니다.
$array1 = ['a' => 1, 'b' => 2, 'c' => 3];
$array2 = ['a' => 1, 'b' => 2, 'c' => 3];
$result = array_diff_assoc($array1, $array2);
print_r($result); // Array ( )
PHP 8.0.0 버전부터의 변경 사항
PHP 8.0.0부터는 array_diff_assoc() 함수를 단 하나의 매개변수만 사용하여 호출할 수 있게 되었습니다.
이전에는 최소 두 개의 매개변수가 필요했습니다.
- PHP 8.0.0 버전 이전에는 항상 적어도 두 개의 배열을 매개변수로 전달해야 합니다.
- PHP 8.0.0 버전부터는 단 하나의 배열만 전달할 수도 있음을 의미합니다.
하나의 배열만 전달할 경우, 비교 대상이 없기 때문에 전달된 배열이 그대로 반환됩니다.
$array = ['a' => 1, 'b' => 2, 'c' => 3];
$result = array_diff_assoc($array);
print_r($result);
/* 출력:
Array
(
[a] => 1
[b] => 2
[c] => 3
)
*/
주의할 점
array_diff_assoc() 함수는 키(Key)와 값(Value) 쌍을 기준으로 배열 간의 차이(difference)를 비교합니다.
데이터 형식이 다르지만 문자열 표현이 같은 경우
키(Key)는 PHP 배열 규칙에 따라 동일성만 비교되며, 값(Value)은 느슨한 비교(loose comparison) 방식으로 비교되어 데이터 형식의 차이를 구분하지 않습니다.
$array1 = ['a' => 1, 'b' => 2, 'c' => '3']; // '3'은 문자열로 저장
$array2 = ['a' => 1, 'b' => 2, 'c' => 3]; // 3은 정수로 저장
$differences = array_diff_assoc($array1, $array2);
print_r($differences) // Array ( )
위의 코드에서 $array1과 $array2는
값 '3'과 3을 포함하고 있지만,
느슨한 비교에서는 두 값이 동일하다고 판단됩니다. 따라서 array_diff_assoc() 함수는 이 차이를 감지하지 않으며,
결과적으로 빈 배열을 반환합니다.
문자열 표현은 동일해아 함
데이터 형식이 다르더라도 문자열 표현이 같은 경우에는 동일하게 처리하지만, array_diff_assoc() 함수는 두 값을 비교할 때 각 요소를 먼저 문자열(string)로 변환한 뒤, 문자열 기준 비교(string comparison)를 수행합니다. 즉, 서로 다른 데이터 타입이라도 문자열로 변환했을 때 그 형태가 같아야 '일치'하는 것으로 간주합니다.
$array1 = array(0, 1, 2); // 정수 0, 1, 2
$array2 = array('00', '01', '2'); // 문자열 '00', '01', '2'
$result = array_diff_assoc($array1, $array2);
print_r($result);
/* 출력:
Array
(
[0] => 0
[1] => 1
)
*/
정수 2는 문자열 '2'와 일치하여 제외되지만, 0과 1은 문자열로 변환해도 각각 '0', '1'이 되어 '00', '01'과는 다르기 때문에 차이점으로 식별됩니다.
활용 예제
array_diff_assoc() 함수는 실전에서 다양한 상황에서 활용될 수 있습니다. 아래는 몇 가지 실전적인 예시들입니다.
권한 체크
$current_permissions = ['read' => true, 'write' => true, 'execute' => false];
$required_permissions = ['read' => true, 'write' => true, 'execute' => true];
$missing_permissions = array_diff_assoc($required_permissions, $current_permissions);
if (!empty($missing_permissions)) {
echo '사용자는 다음 권한이 부족합니다: ' . implode(', ', array_keys($missing_permissions));
} else {
echo '권한이 충분합니다.';
}
// 출력: '사용자는 다음 권한이 부족합니다: execute'
부연설명
implode() 함수는 배열의 요소들을 하나의 문자열로 합치는(변환하는) 함수입니다.
부연설명
array_keys() 함수는 주어진 배열에서 키(keys)만 추출하여 새로운 배열로 반환합니다.
위 예제에서는 필요한 권한을 기준으로 사용자의 권한과 비교하여, 값이 일치하지 않는 키(Key)를 부족한 권한으로 판단합니다.
선택된 옵션 제외하기
$all_options = ['apple' => 1, 'banana' => 2, 'cherry' => 3, 'date' => 4];
$selected_options = ['banana' => 2, 'date' => 4];
$remaining_options = array_diff_assoc($all_options, $selected_options);
echo '선택하지 않은 옵션: ' . implode(', ', array_keys($remaining_options));
// 출력: '선택하지 않은 옵션: apple, cherry'
사용자가 선택한 옵션을 기준으로 모든 옵션 중에서 선택하지 않은 옵션을 찾아냅니다.
버전 관리 시스템에서 변경된 파일 찾기
$committed_files = [
'file1.txt' => 'hash1',
'file2.txt' => 'hash2',
'file3.txt' => 'hash3'
];
$modified_files = [
'file1.txt' => 'hash1',
'file3.txt' => 'hash3',
'file4.txt' => 'hash4'
];
$new_files = array_diff_assoc($modified_files, $committed_files);
if (!empty($new_files)) {
echo '변경된 파일 목록: ' . implode(', ', array_keys($new_files));
} else {
echo '변경된 파일이 없습니다.';
}
// 출력: '변경된 파일 목록: file4.txt'
버전 관리 시스템에서 수정된 파일 목록과 커밋된 파일 목록을 비교하여, 새로 추가되었거나 내용이 변경된 파일을 찾습니다.
이러한 예시들은 array_diff_assoc() 함수를 통해 다양한 상황에서 연관 배열 간의 차이를 찾고, 원하는 조작을 할 수 있음을 보여줍니다. 함수를 적절히 활용하여 간편하게 연관 배열을 처리할 수 있습니다.
같이 보기
- PHP array_diff() 함수 - 다른 배열에 없는 값 찾기
- PHP array_intersect() 함수 - 다른 배열과의 공통 값 찾기
- PHP array_intersect_assoc() 함수 - 키와 값을 기준으로 다른 배열과의 공통 요소 찾기
- PHP in_array() 함수 - 배열에 특정 값이 있는지 확인
- PHP foreach() 반복문 사용법 및 활용 예제
- PHP array_map() 함수 – 개념 정리 및 사용 예제
- PHP array_filter() 함수 - 개념 정리 및 사용 예제
- PHP array_search() 함수 - 개념 정리 및 사용 예제
- PHP array_values() 함수 - 배열 값 목록 가져오기