정의 및 사용 방법
- PHP 버전
- 4+
usort()
함수는 사용자가 원하는 정렬 규칙을 정의한 콜백 함수를 사용하여 값으로 배열을 정렬(user-defined sort by values)합니다.
이때, 정렬 결과가 적용된 배열은 인덱스 배열이 됩니다.
이 함수는 배열의 값을 내림차순이나 오름차순뿐만 아니라, 개발자가 직접 원하는 규칙으로 정렬할 때 유용합니다.
연관 배열에 usort()
함수를 적용하면, 정렬 후에는 기존의 연관 배열 키를 모두 버리고 인덱스 배열 형태의 새로운 숫자 키(0부터 시작)를 할당합니다.
특징
- 배열의 값을 기준으로 원본 배열을 정렬합니다.
- 개발자가 원하는 정렬 규칙은 콜백 함수에 작성합니다.
usort()
함수는 배열을 정렬하는 과정에서 임의의 두 요소의 값을 콜백 함수의 인수로 전달합니다.- 콜백 함수는 두 개의 인수를 받아 상대적인 순서를 결정하는 비교 함수입니다.
- 콜백함수에는 두 개의 인수에 정렬 순서의 앞섬과 뒤섬의 비교 규칙을 만들어 정수로 반환하도록 작성해야 합니다.
- 첫 번째 인수의 정렬 순서가 두 번째 인수보다 앞서려면 음수가 반환 되어야 합니다.
- 첫 번째 인수의 정렬 순서가 두 번째 인수보다 정렬 순서가 뒤서려면 양수가 반환 되어야 합니다.
-
첫 번째 인수와 두 번째 인수의 정렬 순서 변경이 없으려면
0
이 반환 되어야 합니다.
- 이 반환 값에 따라 배열의 값 정렬 순서가 결정됩니다.
- 이 과정은 배열의 모든 요소 쌍에 대해 반복됩니다.
- 모든 비교가 끝나면
usort()
함수가 정렬 순서에 맞춰 배열의 값을 재배열합니다. usort()
함수로 어떤 배열을 정렬하든 정렬 후에는 인덱스 배열 형태로 키가 재할당됩니다. 즉, 정렬 결과가 적용된 배열은 인덱스 배열이 됩니다.
기본 예제
예제에서는 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
)로 작성되어 있어야 하며, 두 인수($a
와 $b
)의 순서를 결정하는 비교 규칙을 작성해야 합니다.
$a
가$b
보다 정렬 순서가 앞서려면 음수가 반환 되어야 합니다.$a
가$b
보다 정렬 순서가 뒤서려면 양수가 반환 되어야 합니다.$a
와$b
의 정렬 순서 변경이 없으려면0
이 반환 되어야 합니다.
배열의 값 정렬 순서의 결정
usort()
함수는 배열에서 임의의 두 값을 선택해 콜백 함수에 인수($a
와$b
)로 전달합니다.- 그럼 콜백 함수는 작성된 규칙을 통해 값을 반환합니다.
- 콜백 함수는 작성된 비교 규칙에 따라 정수 값을 반환합니다.
- 반환된 값은 두 요소 값(인수인
$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) 값의 크기 순서로 두 문자열 비교하기