정의 및 사용 방법
- PHP 버전
- 4+
krsort()
함수는 연관 배열의 키를 숫자나 알파벳 기준으로 내림차순 정렬합니다.
이때 키와 값의 쌍은 그대로 유지합니다.
이 함수는 값이 숫자나 영문으로 구성된 연관 배열에서, 키와 값의 관계가 중요한 데이터(예: 상품명과 가격, 학생 이름과 점수 등)를 내림차순으로 정렬할 때 유용합니다.
참고하세요!
ksort()
는 krsort()
와 반대로, 오름차순으로 정렬합니다.
기본 예제
krsort()
함수는 값이 숫자나 영문으로 구성된 연관 배열에서, 키(key)와 값(value)의 연결이 중요한 데이터를 정렬할 때 특히 적합합니다.
키를 내림차순으로 정렬하면서도 각 항목의 값은 그대로 유지되므로, 데이터를 순서대로 보여주면서 원래 의미를 그대로 살릴 수 있습니다.
다음은 두 가지 예제는 krsort()
함수가 실제로 어떻게 동작하는지 보여줍니다.
학생들의 학번 정렬
학생들의 학번과 이름을 저장한 연관 배열이 있다고 가정해 보겠습니다.
여기서 학번은 키(key)이고, 이름은 값(value)입니다. 학번은 숫자로 이루어져 있으며, krsort()
함수를 사용해서 학번이 큰 순서대로(내림차순) 정렬을 방법을 보여줍니다.
$students = [
1005 => '김민지',
1002 => '박서준',
1008 => '이하나',
1001 => '최윤서'
];
// 키(학번)를 기준으로 내림차순 정렬
krsort($students);
// 결과 출력
print_r($students);
Array ( [1008] => 이하나 [1005] => 김민지 [1002] => 박서준 [1001] => 최윤서 )
상품 목록을 상품명 내림차순으로 정렬하기
온라인 쇼핑몰에서 상품 목록을 상품명 내림차순으로 보여주려 합니다.
상품의 이름(키)과 가격(값)의 연결은 유지되어야 합니다.
다음은 krsort()
함수를 사용하여, 상품명(키)과 가격(값)으로 구성된 연관 배열을 상품명(키) 기준 내림차순으로 정렬하는 예제입니다.
$products = [
'banana' => 5000,
'apple' => 1000,
'cherry' => 2000
];
// 키(상품명) 기준 내림차순으로 정렬
krsort($products);
// 결과 출력
print_r($products);
Array ( [cherry] => 2000 [banana] => 5000 [apple] => 1000 )
특징
krsort()
함수는 배열 자체를 직접 수정합니다. 키를 기준으로 내림차순 정렬하며, 정렬 후에도 각 항목의 값은 그대로 유지됩니다. 새로운 배열은 반환하지 않습니다.- 연관 배열을 정렬할 때 적합합니다.
- 키-값 쌍이 중요한 데이터를 정렬할 때 사용하면, 각 키와 값의 연결이 그대로 유지됩니다.
- 예: 상품명과 가격, 학생 이름과 점수 등 키 기준으로 순서를 정렬해야 하는 경우.
-
인덱스 배열에 사용하기에는 적절하지 않습니다.
krsort()
함수는 배열의 키를 기준으로 내림차순 정렬하면서 키와 값의 연결을 유지하는 것이 가장 큰 특징입니다. 그러나 키(인덱스)에 특별한 의미가 없는 인덱스 배열에 사용하면 키(인덱스)의 순서가 뒤섞여 오히려 혼란을 초래할 수 있습니다. 인덱스 배열에서는rsort()
함수를 사용해야 합니다.
- 키가 숫자나 알파벳으로 구성된 배열에 적합합니다.
- 한글, 일본어, 중국어 등 유니코드 기반 문자열을 정렬할 때는
krsort()
도 바이트 단위 비교를 기본으로 하므로 예상과 다른 결과가 나올 수 있습니다. 이는 유니코드 문자가 멀티바이트로 구성되기 때문입니다.
- 한글, 일본어, 중국어 등 유니코드 기반 문자열을 정렬할 때는
구문
// PHP 8.2.0 전
krsort(array &$array, int $flags = SORT_REGULAR): true
// PHP 8.2.0부터
krsort(array &$array, int $flags = SORT_REGULAR): bool
매개변수
$array |
내림차순으로 정렬할 연관 배열(참조 변수로 전달)입니다. |
---|---|
$flags |
옵션. 상수 옵션입니다. krsort() 는 배열의 키(key)를 비교하여 정렬합니다. 값(value)은 정렬 후에도 유지되며, 다음 상수들로 비교 방식을 지정할 수 있습니다.
|
반환 값
항상 true
를 반환합니다.
변경 이력
PHP 8.2.0 | 이전에는 항상 true 를 반환합니다. 하지만 이제는 이 함수가 정렬을 성공하면 true , 실패하면 false 를 반환합니다. |
---|---|
PHP 8.2.0 | SORT_REGULAR 사용 시 숫자 문자열을 PHP 8 규칙에 따라 숫자처럼 비교합니다. 이전에는 이들을 단순한 문자열로 취급하여 사전순으로 정렬했기 때문에, '2' 가 '10' 보다 앞에 오는 비논리적인 결과가 나왔습니다. 하지만 이제는 이들을 숫자 값으로 인식하여 '10' 이 '2' 보다 크다고 판단하고 올바르게 내림차순 정렬합니다. |
키에 숫자와 문자열(알파벳)이 섞인 연관 배열 정렬
키(key)에 숫자와 문자열이 혼합된 연관 배열을 정렬할 때, krsort()
함수의 $flags
를 사용하여 기준을 숫자 또는 문자열로 지정할 수 있습니다. 정렬 후에도 각 항목의 값(value)은 그대로 유지됩니다.
$items_1 = [
12 => 'a',
'abc' => 'b',
'15' => 'c',
7 => 'd',
'Banana'=> 'e'
];
krsort($items_1, SORT_NUMERIC);
// 키 기준 내림차순 정렬 (SORT_NUMERIC)
// 배열의 모든 키를 숫자로 간주하여 내림차순 정렬
// 숫자로 변환할 수 없는 문자열 키('abc', 'Banana')는 0으로 취급되어 정렬 시 뒤쪽에 위치
// 값(value)들은 그대로 유지됩니다.
var_dump($items_1);
/*
array(5) {
[15]=> string(1) "c" // 문자열 '15' → 숫자 15로 변환 → 내림차순에서 가장 앞
[12]=> string(1) "a" // 숫자 키 12 → 그 다음
[7]=> string(1) "d" // 숫자 키 7 → 그 다음
["abc"]=> string(1) "b" // 숫자로 변환 불가 → 0 취급 → 뒤쪽
["Banana"]=> string(1) "e" // 숫자로 변환 불가 → 0 취급 → 가장 뒤
}
*/
////////////////////
$items_2 = [
12 => 'a',
'abc' => 'b',
'15' => 'c',
7 => 'd',
'Banana'=> 'e'
];
krsort($items_2, SORT_STRING);
// 키 기준 내림차순 정렬 (SORT_STRING)
// 배열의 모든 키를 문자열로 간주하여 사전식 내림차순 정렬
// 값(value)들은 그대로 유지됩니다.
var_dump($items_2);
/*
array(5) {
// 숫자 형태의 문자열이 일반 문자열보다 작은 값이므로 숫자 형태의 문자열이 뒤에 위치함
["abc"]=> string(1) "b" // 'abc' → 사전식 내림차순에서 가장 앞
["Banana"]=> string(1) "e" // 'Banana' → 두 번째
[7]=> string(1) "d" // '7' → 숫자형 문자열로 변환 → 사전식 내림차순 위치
[15]=> string(1) "c" // '15' → 숫자형 문자열로 변환 → 그 다음
[12]=> string(1) "a" // '12' → 숫자형 문자열로 변환 → 가장 뒤
}
*/
💡 주의하세요!
키가 숫자와 문자열(알파벳)이 섞인 연관 배열을 정렬할 때는 기본값인 SORT_REGULAR
를 사용하지 않는 것이 좋습니다. SORT_REGULAR
는 PHP의 기본 비교 규칙을 그대로 적용하기 때문에 상황에 따라 숫자로도, 문자열로도 비교가 섞여 예상과 다른 정렬 순서가 나올 수 있습니다.
💡 TIP
문자열을 정확히 사전순으로 정렬하려면 krsort($items, SORT_STRING)
을, 모든 항목을 숫자로 비교하려면 krsort($items, SORT_NUMERIC)
을 사용해야 일관된 결과를 얻을 수 있습니다.