정의 및 사용 방법
- PHP 버전
- 4+
usort()
함수는 사용자가 원하는 정렬 규칙을 정의한 콜백 함수를 사용하여 값으로 배열을 정렬(user-defined sort)합니다.
이때, 정렬 결과가 적용된 배열은 인덱스 배열이 됩니다.
이 함수는 배열의 값을 내림차순이나 오름차순뿐만 아니라, 개발자가 직접 원하는 규칙으로 정렬할 때 유용합니다.
연관 배열에 usort()
함수를 적용하면, 정렬 후에는 기존의 연관 배열 키를 모두 버리고 인덱스 배열 형태의 새로운 숫자 키(0부터 시작)를 할당합니다.
특징
- 배열의 값을 기준으로 원본 배열을 정렬합니다.
- 개발자가 원하는 정렬 규칙은 콜백 함수에 작성합니다.
- 이 콜백 함수는 항상 두 개의 인수를 받아 상대적인 순서를 결정하는 비교 함수입니다.
- 두 개의 인수에 정렬 순서의 앞섬과 뒤섬의 비교 규칙을 만들어 정수로 반환하도록 작성해야 합니다.
- 정렬 순서가 앞서려면 음수가 반환 되어야 합니다.
- 정렬 순서가 뒤서려면 양수가 반환 되어야 합니다.
-
정렬 순서 변경이 없으려면
0
이 반환 되어야 합니다.
- 이 반환 값에 따라 배열의 값 정렬 순서가 결정됩니다.
- 이 함수로 어떤 배열을 정렬하든 정렬 후에는 인덱스 배열 형태로 키가 재할당됩니다. 즉, 정렬 결과가 적용된 배열은 인덱스 배열이 됩니다.
기본 예제
예제에서는 usort()
함수의 기본적인 동작 원리를 단계별로 이해할 수 있도록, 숫자 배열의 오름차순 정렬을 구현해 봅니다.
콜백 함수 안의 조건문을 세 가지 경우로 나누어, 음수, 0
, 양수가 반환될 때 배열의 값이 어떻게 정렬되는지를 직관적으로 확인할 수 있습니다. 이 함수의 작동 방식을 이해하면, 이후 문자열, 날짜, 복합 조건 등 다양한 값 기준 정렬도 쉽게 확장할 수 있습니다.
$arr = [2, 3, 1, 5, 4];
// 배열 값의 숫자 오름차순 정렬
// 숫자에서 오름차순은 1 → 2 → 3 → 4 → …… 와 같이 뒤로 갈수록 숫자가 커지는 순으로 정렬
usort($arr, function($a, $b) {
if ($a > $b) {
return 1; // $a가 더 크므로(뒤에 와야 하므로) 양수 반환 (뒤섬)
}
if ($a < $b) {
return -1; // $a가 더 작으므로(앞에 와야 하므로) 음수 반환 (앞섬)
}
if ($a == $b) {
return 0; // 두 값이 같으므로 순서 변경 없음
}
});
print_r($arr); // 배열의 값을 기준으로 원본 배열을 정렬
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
구문
// PHP 8.2.0 전
usort(array &$array, callable $callback): true
// PHP 8.2.0부터
usort(array &$array, callable $callback): bool
매개변수
&$array |
정렬할 배열(참조 변수로 전달)입니다. |
---|---|
$callback |
배열 요소의 값을 비교하는 콜백 함수입니다.
|
$callback
의 구조
usort()
함수의 두 번째 매개변수인 콜백 함수($callback
)는 배열의 두 요소를 비교하여 상대적인 순서를 결정하는 함수입니다. 이 콜백 함수는 항상 두 개의 인수를 받으며, 정렬 방향을 나타내는 정수 값을 반환해야 합니다.
callback(mixed $a, mixed $b): int
콜백 함수의 매개변수: callback(mixed $a, mixed $b)
콜백 함수는 항상 두 개의 인수를 받아야 합니다.
usort()
함수는 배열을 정렬하는 과정에서 임의의 두 값을 선택해$a
와$b
에 전달합니다.- 콜백 함수는
$a
를 기준으로$b
비교하여 어느 값이 앞서야 하는지 판단합니다. $a
는 비교의 기준이 되는 값,$b
는$a
와 비교할 대상 값입니다.- 즉, 콜백 함수의 역할은 "두 개의 인수 중 어느 것이 더 앞서야 하는가"를
usort()
함수에 알려주는 것입니다. - "두 개의 인수 중 어느 것이 더 앞서야 하는가"는 반환 값을 기준으로 판단합니다.
콜백 함수의 반환 값
콜백함수에 반환 값은 반드시 정수(int
)로 작성되어 있어야 하며, 두 인수의 순서를 결정하는 비교 규칙을 작성해야 합니다.
- 정렬 순서가 앞서려면 음수가 반환 되어야 합니다.
- 정렬 순서가 뒤서려면 양수가 반환 되어야 합니다.
- 정렬 순서 변경이 없으려면
0
이 반환 되어야 합니다.
배열의 값 정렬 순서의 결정
usort()
함수는 배열에서 임의의 두 값을 선택해 콜백 함수에$a
와$b
로 전달합니다.- 그럼 콜백 함수는 작성된 규칙을 통해 값을 반환합니다.
- 콜백 함수는 작성된 비교 규칙에 따라 정수 값을 반환합니다.
- 반환된 값은 두 요소의 상대적인 정렬 순서를 결정합니다
- 이 과정은 배열의 모든 요소 쌍에 대해 반복됩니다.
- 모든 비교가 끝나면
usort()
함수가 정렬 순서에 맞춰 배열의 값을 재배열합니다. - 연관 배열의 경우에는 값이 정렬될 때 키(key)도 값에 맞춰 재정렬됩니다.
반환 값
- PHP 8.2.0 전에는 성공 시
true
, 실패 시false
를 반환합니다. - PHP 8.2.0부터는 항상
true
를 반환합니다.
변경 이력
버전 | 설명 |
---|---|
8.2.0 | 항상 true 를 반환합니다.
이전에는 성공 시 true , 실패 시 false 를 반환했었습니다. |
8.2.0 | 이전에는 콜백 함수($callback )의 매개변수를 참조로 전달받도록 할 수 있었지만, 이제는 참조로 전달하는 것을 명시적으로 금지합니다. E_WARNING 경고를 발생시킵니다. |
주의! 연관 배열 정렬 시 키의 재할당
usort()
함수는 값을 기준으로 정렬하되, 정렬 후에는 기존의 연관 배열 키를 모두 버리고 인덱스 배열처럼 새로운 숫자 키(0부터 시작)를 할당합니다. 이 점을 확인할 수 있는 연관 배열 예제를 만들어 보겠습니다.
$data = [
'c' => 30, // 기존 키: 'c'
'a' => 10, // 기존 키: 'a'
'b' => 20, // 기존 키: 'b'
'd' => 40 // 기존 키: 'd'
];
// 값을 기준으로 오름차순 정렬
// $a와 $b는 배열의 값(value)인 숫자입니다.
usort($data, function($a, $b) {
if ($a > $b) {
return 1;
} elseif ($a < $b) {
return -1;
} else {
return 0;
}
});
print_r($data);
array(4) {
[0]=>
int(10)
[1]=>
int(20)
[2]=>
int(30)
[3]=>
int(40)
}
예제를 통해 알 수 있듯이 연관 배열에 usort()
함수를 적용할 때에는 기존의 키가 완전히 재할당된다는 점에 유의해야 합니다.
다차원 배열 정렬하기
반면에 usort()
함수는 사용자가 정의한 비교 규칙을 기반으로 다차원 배열을 자유롭게 정렬할 수 있는 점에서 매우 유용합니다.
다음에 나오는 예제에서는 usort()
함수를 활용해서 쇼핑몰 등에서 상품의 정보를 가지고 있는 다차원 배열을 "낮은 가격" 기준으로 정렬하는 방법을 살펴봅니다.
$products = [
['name' => 'Laptop', 'price' => 1200],
['name' => 'Smartphone', 'price' => 800],
['name' => 'Headphones', 'price' => 150],
['name' => 'Monitor', 'price' => 300]
];
// 가격을 기준으로 오름차순(낮은 가격) 정렬
// $a와 $b의 가격을 비교하여 순서를 결정
// $a['price'] = $a 인수 배열 안의 'price' 값
// $b['price'] = $b 인수 배열 안의 'price' 값
usort($products, function($a, $b) {
if ($a['price'] > $b['price']) {
return 1; // $a가 더 크면 뒤로
} elseif ($a['price'] < $b['price']) {
return -1; // $a가 더 작으면 앞으로
} else {
return 0; // 같으면 순서 변경 없음
}
});
print_r($products);
Array
(
[0] => Array
(
[name] => Headphones
[price] => 150
)
[1] => Array
(
[name] => Monitor
[price] => 300
)
[2] => Array
(
[name] => Smartphone
[price] => 800
)
[3] => Array
(
[name] => Laptop
[price] => 1200
)
)
예제에서는 상품의 가격을 기준으로 다차원 배열을 정렬하는 방법을 살펴보았습니다.
이 방법은 가격뿐 아니라, 상품명, 인기순, 재고량 등 다양한 기준으로 배열을 정렬할 때도 활용할 수 있습니다. 다차원 배열을 원하는 규칙에 맞춰 자유롭게 정렬할 수 있다는 것은 usort()
함수의 큰 장점입니다.
참고문헌
같이 보기
- PHP sort() 함수 – 인덱스 배열의 요소를 (숫자·영문) 오름차순 정렬
- PHP rsort() 함수 – 인덱스 배열의 요소를 (숫자·영문) 내림차순 정렬
- PHP ksort() 함수 – 연관 배열의 키를 (숫자·영문) 오름차순 정렬
- PHP krsort() 함수 – 연관 배열의 키를 (숫자·영문) 내림차순 정렬
- PHP asort() 함수 – 연관 배열의 값을 (숫자·영문) 오름차순 정렬
- PHP arsort() 함수 – 연관 배열의 값을 (숫자·영문) 내림차순 정렬
- PHP array_reverse() 함수 – 배열 요소 역순 정렬
- PHP array_map() 함수 – 개념 정리 및 사용 예제
- PHP foreach 반복문 사용법 및 활용 예제
- PHP strcmp() 함수 – 이진(Binary) 값의 크기 순서로 두 문자열 비교하기