728x90
안녕하세요.
오늘은 usort()로 '사용자 목록'을 '나이 순'으로 정렬해보도록 하겠습니다.
PHP의 기본 sort() 함수는 [5, 1, 3] 같은 단순한 1차원 배열을 [1, 3, 5]로 정렬해줍니다.
하지만 여러 정보를 담고 있는 2차원 배열(혹은 객체 리스트)을 '나이(age) 순'이나 '이름(name) 순'으로 정렬할 때는 sort() 함수로 정렬하기 어렵습니다.
이런 경우 usort() (User-defined Sort)로 비교 규칙을 주어 정렬할 수 있습니다.
usort()
- 콜백 함수와 우주선 연산자 (<=>)가 핵심입니다.
- usort는 function($a, $b) { ... } 형태의 콜백 함수를 받습니다.
- 이 함수는 배열의 두 요소($a, $b)를 받아서, 누가 더 큰지 알려주는 숫자(-1, 0, 1)를 반환해야 합니다.
$a <=> $b는 $a와 $b를 비교하여 다음을 반환합니다.
- $a가 $b보다 작으면: -1
- $a와 $b가 같으면: 0
- $a가 $b보다 크면: 1
예제
<?php
$users = [
['name' => '앨리스', 'age' => 30],
['name' => '밥', 'age' => 19],
['name' => '찰리', 'age' => 25]
];
// --- 1. sort() 실패 예시 ---
echo "--- 1. sort()로 정렬 시도 (실패) ---\n";
// PHP 8+에서는 Warning: Array to string conversion이 발생합니다.
@sort($users);
print_r($users);
echo "\n";
// --- 2. usort()로 '나이(age)' 오름차순 정렬 (성공) ---
echo "--- 2. usort() '나이' 오름차순 정렬 ---\n";
// $a의 age와 $b의 age를 비교
usort($users, function($a, $b) {
return $a['age'] <=> $b['age'];
});
print_r($users);
echo "\n";
// --- 3. (응용) usort()로 '나이(age)' 내림차순 정렬 ---
echo "--- 3. usort() '나이' 내림차순 정렬 ---\n";
// $a와 $b의 위치만 바꿔주면 내림차순이 됩니다.
usort($users, function($a, $b) {
return $b['age'] <=> $a['age'];
});
print_r($users);
echo "\n";
?>
결과
--- 1. sort()로 정렬 시도 (실패) ---
Array
(
[0] => Array
(
[name] => 밥
[age] => 19
)
[1] => Array
(
[name] => 앨리스
[age] => 30
)
[2] => Array
(
[name] => 찰리
[age] => 25
)
)
--- 2. usort() '나이' 오름차순 정렬 ---
Array
(
[0] => Array
(
[name] => 밥
[age] => 19
)
[1] => Array
(
[name] => 찰리
[age] => 25
)
[2] => Array
(
[name] => 앨리스
[age] => 30
)
)
--- 3. usort() '나이' 내림차순 정렬 ---
Array
(
[0] => Array
(
[name] => 앨리스
[age] => 30
)
[1] => Array
(
[name] => 찰리
[age] => 25
)
[2] => Array
(
[name] => 밥
[age] => 19
)
)
'PHP' 카테고리의 다른 글
| [PHP] Secure Password Hashing - password_hash()로 비밀번호 저장 (0) | 2025.11.10 |
|---|---|
| [PHP] array_merge와 + 연산자로 두 배열 합치기의 차이점 (0) | 2025.11.09 |
| [PHP] NumberFormatter로 '2000000'을 '이백만'으로 변환하기 (0) | 2025.11.05 |
| [PHP] IteratorAggregate - 루프에서 사용될 때 어떤 이터레이터를 사용할지 위임하기. (0) | 2025.11.03 |
| [PHP] 초성 검색 기능 구현하기 (0) | 2025.11.02 |