본문 바로가기
PHP

[PHP] usort()로 '사용자 목록'을 '나이 순'으로 정렬

by teamnova 2025. 11. 6.
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
        )

)