반응형
Web Development · PHP 배열 정렬
PHP ksort() — 연관 배열 키 오름차순 정렬 · 사전순 · asort()와 비교 완전 정리
k = key — 값이 아닌 키(RADIO1, TV1, TV2)를 사전순(알파벳순)으로 정렬, 값은 키와 함께 이동
시작 오늘 분석할 코드
ksort()는 연관 배열을 키(key) 기준 오름차순(사전순)으로 정렬한다. k = key의 약자로, 값이 아닌 키 이름(TV1, TV2, RADIO1 같은 문자열)으로 순서를 결정한다. 키가 정렬되면 해당 키의 값도 함께 이동한다.
<?php $sales = array("TV2" => "1000", "TV1" => "500", "RADIO1" => "800"); ksort($sales); // 주석에 "내림차순"이라고 적혀있으나 ksort()는 키 오름차순(사전순)! print "<PRE>"; print_r($sales); print "</PRE>"; ?>
⚠ 원본 코드 주석에 "key로 내림차순 정렬"이라고 적혀 있지만 ksort()는 키 오름차순(사전순, A→Z)이다. 키 내림차순은 krsort()를 사용한다.
정렬 전
Array
(
[TV2] => 1000
[TV1] => 500
[RADIO1] => 800
)
(
[TV2] => 1000
[TV1] => 500
[RADIO1] => 800
)
→
ksort() 후 (키 오름차순, 사전순)
Array
(
[RADIO1] => 800
[TV1] => 500
[TV2] => 1000
)
(
[RADIO1] => 800
[TV1] => 500
[TV2] => 1000
)
키(RADIO1 → TV1 → TV2) 사전순 / 각 키의 값은 함께 이동
용어 핵심 용어 정리
ksort()k = key — 연관 배열 키 기준 오름차순(사전순) 정렬, 키 보존
사전순(알파벳순)대문자 A-Z, 그 다음 소문자 a-z 순 / RADIO1 < TV1 < TV2 (R < T)
krsort()ksort()의 반대 — 키 기준 내림차순(Z→A 역사전순)
asort() 차이asort()는 값 기준 정렬 / ksort()는 키 기준 정렬
키 비교 방식문자열 키는 기본적으로 사전순(lexicographic) 비교 — SORT_NATURAL로 자연순 전환 가능
값 이동키가 정렬되면 그 키에 묶인 값도 함께 이동 — RADIO1:800이 앞으로
1 사전순 정렬의 원리 — 왜 RADIO1이 TV1보다 앞에?
ksort()의 사전순은 알파벳 첫 글자부터 비교한다. R(RADIO1)과 T(TV1, TV2)를 비교하면 R < T이므로 RADIO1이 앞에 온다. TV1과 TV2는 첫 두 글자 TV가 같고 세 번째 문자 1 < 2이므로 TV1이 앞에 온다.
// 사전순 비교 예 "RADIO1" vs "TV1" : R < T → RADIO1이 앞 "TV1" vs "TV2" : T=T, V=V, 1 < 2 → TV1이 앞 "abc" vs "ABC" : 소문자(97) > 대문자(65) → 대문자가 먼저 "a" vs "B" : A(65) < a(97) 이므로 대문자가 앞 // 결과 순서: RADIO1 → TV1 → TV2 (R < T, TV1 < TV2)
2 asort() vs ksort() — 무엇을 기준으로 정렬하나
asort() — 값 기준 정렬
$sales = ["TV2"=>"1000","TV1"=>"500","RADIO1"=>"800"];
asort($sales);
// [TV1]=>"500" [RADIO1]=>"800" [TV2]=>"1000"
// 값(500, 800, 1000)으로 순서 결정
asort($sales);
// [TV1]=>"500" [RADIO1]=>"800" [TV2]=>"1000"
// 값(500, 800, 1000)으로 순서 결정
ksort() — 키 기준 정렬
$sales = ["TV2"=>"1000","TV1"=>"500","RADIO1"=>"800"];
ksort($sales);
// [RADIO1]=>"800" [TV1]=>"500" [TV2]=>"1000"
// 키(RADIO1, TV1, TV2)로 순서 결정
ksort($sales);
// [RADIO1]=>"800" [TV1]=>"500" [TV2]=>"1000"
// 키(RADIO1, TV1, TV2)로 순서 결정
3 SORT_NATURAL 플래그 — 자연어 순서
기본 ksort()는 사전순(lexicographic)이라 "TV10"이 "TV2"보다 앞에 온다(1 < 2이므로). 사람이 읽는 자연스러운 숫자 순서(TV2 → TV10)가 필요하면 SORT_NATURAL 플래그를 사용한다.
$items = ["TV10"=>200, "TV2"=>100, "TV1"=>150]; // 기본 사전순 — 사람 직관과 다름 ksort($items); // TV1 → TV10 → TV2 (사전순: 1 < 10첫자리'1' < 2) // 자연어 순서 — 숫자를 수치로 인식 ksort($items, SORT_NATURAL); // TV1 → TV2 → TV10 (사람이 읽는 자연스러운 순서)
※ 파일명(file1.txt, file2.txt, file10.txt), 제품코드(TV1, TV2, TV10) 등 숫자가 포함된 문자열 키를 정렬할 때는 SORT_NATURAL을 명시하면 직관적인 결과를 얻는다.
반응형
4 연관 배열 정렬 6함수 비교 — ksort 위치 확인
| 함수 | 정렬 기준 | 방향 | 키 보존 | 주요 용도 |
|---|---|---|---|---|
sort() |
값 | 오름차순 | 아니오 | 숫자 인덱스 배열 |
rsort() |
값 | 내림차순 | 아니오 | 숫자 인덱스 배열 역순 |
asort() |
값 | 오름차순 | 예 | 연관배열 가격 낮은 순 |
arsort() |
값 | 내림차순 | 예 | 연관배열 매출 높은 순 |
ksort() |
키 | 오름차순 | 예 | 연관배열 제품코드 사전순 |
krsort() |
키 | 내림차순 | 예 | 연관배열 제품코드 역순 |
5 ksort() 실용 패턴 — 제품 카탈로그 코드순 출력
$products = [ "TV2" => "대형 TV", "RADIO1" => "FM 라디오", "AC1" => "에어컨", "TV1" => "소형 TV", ]; ksort($products); foreach ($products as $code => $name) { print "[$code] $name<br>"; } // [AC1] 에어컨 // [RADIO1] FM 라디오 // [TV1] 소형 TV // [TV2] 대형 TV
6 ksort() 없이 같은 결과 만들기 — 왜 ksort()가 더 나은가
ksort() 없이 키로 정렬하려면 array_keys()로 키를 추출, sort()로 정렬, array_combine()으로 다시 묶는 3단계 과정이 필요하다. ksort()는 이 과정을 한 줄로 처리한다.
$sales = ["TV2"=>1000, "TV1"=>500, "RADIO1"=>800]; // ksort() 없이 (비효율) $keys = array_keys($sales); // ["TV2","TV1","RADIO1"] sort($keys); // ["RADIO1","TV1","TV2"] $values = array_map(fn($k) => $sales[$k], $keys); $sorted = array_combine($keys, $values); // ksort() 사용 (간결) ksort($sales); // 한 줄로 동일 결과
7 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| ksort/krsort 방향 혼동 | 내림차순이 필요한 곳에 ksort 사용 — 역순 | ksort = 키 오름차순(A→Z), krsort = 키 내림차순(Z→A) |
| asort와 ksort 혼동 | 값 기준 정렬 의도였는데 키 기준으로 정렬됨 | asort = 값 기준 / ksort = 키 기준 — a(associative) vs k(key) |
| 숫자 포함 키를 사전순 정렬 | TV10이 TV2보다 앞에 와서 직관적이지 않음 | SORT_NATURAL 플래그 사용 — ksort($arr, SORT_NATURAL) |
| $sorted = ksort($arr) 반환값 사용 | $sorted = true (bool) — 배열 아님 | ksort($arr); 후 $arr을 직접 사용 |
// k = key 기억법 ksort() → 키 사전순(A→Z) 오름차순 krsort() → 키 역사전순(Z→A) 내림차순 // 값이 아닌 키(코드명)로 목록을 정리할 때 사용
7 숫자 키 배열에서의 ksort() — 수치 비교 vs 사전순
연관 배열의 키가 숫자처럼 보이는 문자열일 때 ksort()는 수치 비교를 한다. 순수 정수 키도 마찬가지다. 단, 혼재하면 사전순이 될 수 있어 주의가 필요하다.
// 숫자 키 — 수치 비교 $scores = [10 => "C+", 5 => "B", 20 => "A"]; ksort($scores); // Array ( [5] => "B" [10] => "C+" [20] => "A" ) — 수치 오름차순 // 문자열 숫자 키 — 수치 비교 $items = ["10" => "C+", "5" => "B", "20" => "A"]; ksort($items); // Array ( [5] => "B" [10] => "C+" [20] => "A" ) — 수치 비교 // 문자열 + 숫자 혼재 키 — 문자열로 비교 전환 $mixed = ["b10" => 1, "a5" => 2, "c20" => 3]; ksort($mixed); // Array ( [a5] => 2 [b10] => 1 [c20] => 3 ) — 사전순
※ 정수 키만 있으면 수치 비교, 문자열 키가 하나라도 있으면 모두 문자열 사전순으로 비교한다. SORT_STRING / SORT_NUMERIC 플래그로 강제 지정 가능하다.
핵심 한 줄 요약
ksort()k = key — 연관 배열 키 기준 오름차순(사전순, A→Z) 정렬, 키 보존
RADIO1 → TV1 → TV2R < T(사전순) / TV1 < TV2(세 번째 문자 1 < 2) — 알파벳·숫자 비교
asort() vs ksort()asort = 값(가격)으로 정렬 / ksort = 키(제품코드)로 정렬
SORT_NATURAL 플래그ksort($arr, SORT_NATURAL) — TV1→TV2→TV10 자연스러운 숫자 순서
반환값은 boolksort() 반환값(true) 아닌 $arr 자체가 변경됨 — $sorted = ksort() 오류
krsort()ksort()의 반대 — 키 기준 내림차순(Z→A) / TV2→TV1→RADIO1 순
사용 시점제품 카탈로그, 설정 목록, 사전형 데이터를 코드명 순으로 정렬할 때
원본 .md 주석 오류원본 코드에 "key로 내림차순" 주석이 있지만 ksort()는 오름차순 — 소스 오류
선택 기준키 이름 순 = ksort / 키 역순 = krsort / 값 오름차순 = asort / 값 내림차순 = arsort
숫자 키 수치 비교정수 키 배열은 ksort()에서 수치 비교 — "5" < "10" (사전순은 "10" < "5")
SORT_NATURAL 조합ksort($arr, SORT_NATURAL) — TV1 → TV2 → TV10 인간친화적 숫자 순서
uksort()사용자 정의 키 비교 로직이 필요하면 uksort() — uk = user key sort
PHP 8.0+ 안정 정렬ksort()도 PHP 8.0부터 같은 키 가진 요소들 원래 순서 보장 (일반적으로 키는 고유)
원본 .md 주석 오류원본 코드에 "key로 내림차순" 주석이 있지만 ksort()는 오름차순 — 소스 오류
array_key_first() (PHP 7.3+)ksort() 후 array_key_first($arr) → 사전순 첫 번째 키(RADIO1)
비교: ksort vs array_keys+sortksort() 한 줄 = array_keys → sort → array_combine 3단계 코드와 동일 결과
PHP 8.0+ stable sortksort()도 PHP 8.0부터 안정 정렬 — 연관 배열 키는 고유하므로 실질적 영향 없음
Tags
#PHP #ksort #키정렬 #연관배열 #오름차순 #사전순 #asort #배열정렬 #PHP함수 #PHP학습 #웹개발 #티스토리 #정렬함수
▼ 티스토리 태그 입력란 복사용
PHP, ksort, 키정렬, 연관배열, 오름차순, 사전순, asort, 배열정렬, PHP함수, PHP학습
반응형
'php' 카테고리의 다른 글
| PHP array_pop() — 배열 끝 요소 제거 · 스택 pop · array_push()와 비교 완전 정리 (0) | 2026.07.09 |
|---|---|
| PHP array_push() — 배열 끝에 요소 추가 · 스택 구조 · [] 연산자와 비교 완전 정리 (0) | 2026.07.09 |
| PHP krsort() — 연관 배열 키 내림차순 정렬 · 역사전순 · ksort()와 비교 완전 정리 (0) | 2026.07.09 |
| PHP arsort() — 연관 배열 값 내림차순 정렬 · 키 보존 · asort()와 비교 완전 정리 (0) | 2026.07.09 |
| PHP asort() — 연관 배열 값 오름차순 정렬 · 키 보존 · sort()와 비교 완전 정리 (0) | 2026.07.09 |
왕진 블로그

댓글