시작 오늘 분석할 코드
sort()는 PHP 배열을 오름차순(작은 수 → 큰 수)으로 정렬한다. 정렬 후 원본 배열이 직접 변경되며, 인덱스가 0부터 다시 매겨진다. 반환값은 성공 여부(bool)이고, 정렬 결과를 별도 변수로 받지 않는다.
<?php $numbers = array(18, 7, 20, 5); sort($numbers); // 주석에 "내림차순"이라고 적혀있으나 sort()는 오름차순! print "<PRE>"; print_r($numbers); print "</PRE>"; ?>
⚠ 원본 코드 주석에 "내림차순 정렬"이라고 적혀 있지만 sort()는 오름차순(작은 수 → 큰 수)이다. 내림차순은 rsort()를 사용한다.
실제 출력 미리보기
정렬 전
Array
(
[0] => 18
[1] => 7
[2] => 20
[3] => 5
)
→
sort() 후 (오름차순)
Array
(
[0] => 5
[1] => 7
[2] => 18
[3] => 20
)
용어 핵심 용어 정리
sort()배열을 오름차순(작은 → 큰)으로 정렬. 원본 배열 직접 수정, 인덱스 재배치
오름차순Ascending — 5, 7, 18, 20처럼 작은 값부터 큰 값 순서
인덱스 재배치sort() 후 키가 0, 1, 2, 3으로 다시 매겨짐 — 원래 키 정보 소실
print_r()배열 구조를 사람이 읽기 쉬운 형태로 출력 — 인덱스와 값을 함께 표시
<PRE> 태그Preformatted Text — 줄바꿈과 공백을 그대로 유지. print_r()과 조합해 배열 구조 정렬 출력
반환값 boolsort() 성공 시 true, 실패 시 false 반환. 정렬 결과는 반환값이 아닌 원본 배열에 반영
원본 수정 (in-place)$result = sort($numbers)가 아닌 sort($numbers) — 결과를 새 변수로 받지 않음
rsort()sort()의 반대 — 내림차순(큰 → 작은) 정렬. 역시 인덱스 재배치 발생
1 sort()의 동작 원리 — 원본 배열을 직접 변경
sort()는 배열을 새로 만들어 반환하지 않는다. 인수로 넘긴 배열 변수 자체를 정렬된 상태로 바꾼다. 이런 방식을 in-place(제자리) 정렬이라 한다. sort() 호출 후 원본 $numbers 변수가 정렬된 배열로 변경된다.
$numbers = array(18, 7, 20, 5); // 틀린 사용 방법 — 반환값을 받으려 함 $sorted = sort($numbers); // $sorted = true (bool), 정렬 결과 아님! print_r($sorted); // 1 출력 (true) // 올바른 사용 방법 sort($numbers); // 반환값 무시, $numbers 자체가 변경됨 print_r($numbers); // 정렬된 배열 출력
2 인덱스 재배치 — 연관 배열에서 주의점
sort()는 정렬 후 인덱스를 0부터 다시 매긴다. 숫자 인덱스 배열에서는 자연스럽지만, 연관 배열(문자열 키)에 sort()를 쓰면 원래 키가 모두 사라지고 0, 1, 2, ...로 바뀐다. 키를 유지하며 정렬해야 할 때는 asort()를 사용해야 한다.
sort() — 키 소실 위험
$sales = ["TV2"=>"1000", "TV1"=>"500"];
sort($sales);
// 결과: [0]=>"500", [1]=>"1000"
// "TV1", "TV2" 키 정보 사라짐!
asort() — 키 보존
$sales = ["TV2"=>"1000", "TV1"=>"500"];
asort($sales);
// 결과: ["TV1"]=>"500", ["TV2"]=>"1000"
// 키 그대로 유지되며 값으로 정렬
3 print_r() + <PRE> — 배열 구조 가독성 있게 출력
print_r()만 쓰면 HTML에서 공백과 줄바꿈이 무시되어 배열이 한 줄로 출력된다. <PRE> 태그는 안의 내용을 preformatted 텍스트로 처리해 줄바꿈과 들여쓰기를 유지한다. 개발·디버그 단계에서 자주 쓰이는 조합이다.
print "<PRE>"; print_r($numbers); // 줄바꿈+들여쓰기가 유지된 가독성 있는 출력 print "</PRE>"; // PRE 없이 print_r만 쓰면 — 브라우저에서 한 줄로 붙어 나옴 print_r($numbers); // Array ( [0] => 5 [1] => 7 [2] => 18 [3] => 20 ) // 개발 환경에서 더 나은 방법 — var_dump()로 타입 포함 출력 var_dump($numbers); // 각 요소의 타입과 값 함께 출력
4 PHP 정렬 함수 6종 비교표
| 함수 |
정렬 기준 |
방향 |
키 보존 |
sort() |
값(value) |
오름차순 (5→20) |
아니오 (재배치) |
rsort() |
값(value) |
내림차순 (20→5) |
아니오 (재배치) |
asort() |
값(value) |
오름차순 |
예 (연관 키 유지) |
arsort() |
값(value) |
내림차순 |
예 (연관 키 유지) |
ksort() |
키(key) |
오름차순 |
예 (키로 정렬) |
krsort() |
키(key) |
내림차순 |
예 (키로 정렬) |
※ sort/rsort는 숫자 인덱스 배열에 적합. asort/arsort/ksort/krsort는 연관 배열(key=>value)에 키를 유지하며 정렬할 때 사용한다.
5 정렬 기준 — 숫자 vs 문자열
sort()는 배열 요소를 숫자로 처리할 수 있으면 숫자 비교로, 아니면 문자열 비교로 정렬한다. 숫자가 섞인 배열에서 의도치 않은 순서가 나올 수 있다. 명시적으로 정렬 기준을 지정하려면 두 번째 인수로 플래그를 넘긴다.
$data = array(10, 9, 100, 2); sort($data); // 결과: [2, 9, 10, 100] ← 숫자 비교 (SORT_NUMERIC이 기본 적용) $data2 = array("10", "9", "100", "2"); sort($data2); // 결과: ["2", "9", "10", "100"] ← 숫자 변환 가능하면 숫자 비교 // 명시적 문자열 비교 플래그 sort($data2, SORT_STRING); // 결과: ["10", "100", "2", "9"] ← 사전순 (1 < 2 < 9)
6 usort() — 사용자 정의 정렬 기준
sort()는 PHP가 정한 기본 비교 방식으로 정렬한다. 직접 비교 로직을 정의하려면 usort()를 사용한다. 예를 들어 배열 안의 배열(2차원 배열)을 특정 키로 정렬하거나, 복잡한 조건으로 순서를 결정할 때 필요하다.
// 2차원 배열을 나이(age) 기준 오름차순 정렬 $people = [ ['name'=>'홍길동', 'age'=>30], ['name'=>'김철수', 'age'=>25], ['name'=>'이영희', 'age'=>28], ]; usort($people, function($a, $b) { return $a['age'] - $b['age']; // 양수 반환 시 $a가 $b 뒤로 }); // 결과: 김철수(25), 이영희(28), 홍길동(30)
※ usort()의 콜백 반환값: 음수 → $a가 앞, 0 → 순서 유지, 양수 → $b가 앞. $a['age'] - $b['age']가 음수이면 $a가 더 젊어 앞으로 온다. PHP 8.0부터 이 패턴 대신 Spaceship 연산자 ($a['age'] ⟺ $b['age'])를 쓰기도 한다.
7 PHP 8.0 안정 정렬 — stable sort 보장
PHP 8.0 이전의 sort()는 불안정 정렬(unstable sort)이었다. 값이 같은 요소의 원래 순서가 유지된다는 보장이 없었다. PHP 8.0부터 sort()를 포함한 모든 정렬 함수가 안정 정렬로 변경되어, 같은 값을 가진 요소들은 원래 순서를 유지한다.
// PHP 8.0 이전 — 같은 값의 순서 보장 없음 $data = ['사과', '바나나', '사과', '포도']; sort($data); // 두 '사과'의 원래 순서(0번, 2번)가 유지될지 불확실 // PHP 8.0+ — 안정 정렬로 같은 값의 원래 순서 보장됨
※ 웹 개발 학습 단계에서는 이 차이가 크게 드러나지 않는다. 같은 값이 많은 대용량 배열을 정렬할 때, 같은 값 내에서 원래 순서가 중요한 경우에만 이 차이가 의미를 갖는다.
8 자주 하는 실수
| 실수 |
증상 |
해결 |
| $sorted = sort($numbers) 반환값 사용 |
$sorted = true (bool) → print_r($sorted) 시 1 출력 |
sort() 반환값 무시, $numbers를 직접 출력 |
| 연관 배열에 sort() 사용 |
키(TV1, TV2 등) 모두 사라지고 0, 1, 2로 재배치 |
키 유지 필요 시 asort() 사용 |
| sort() 결과를 정렬 전 배열로 혼동 |
sort()는 원본을 수정하므로 이전 값 복구 불가 |
정렬 전 $backup = $numbers로 백업 후 정렬 |
| PRE 없이 print_r() 출력 |
HTML에서 줄바꿈 없이 한 줄로 출력 — 가독성 저하 |
print "<PRE>"; print_r($arr); print "</PRE>"; |
핵심 한 줄 요약
sort($numbers)오름차순 정렬 — 반환값(bool) 아닌 $numbers 자체가 변경됨
인덱스 재배치sort() 후 키가 0, 1, 2, ...로 다시 매겨짐 — 원래 키 정보 소실
print "<PRE>" + print_r()배열 구조를 가독성 있게 출력 — PRE 없으면 한 줄로 붙어 나옴
연관 배열 정렬키 유지 필요 시 asort() — sort()는 키를 소실시킴
rsort()sort()의 반대 — 내림차순(큰 → 작은) 정렬
usort()콜백 함수로 사용자 정의 정렬 — 2차원 배열이나 복잡한 조건에 사용
PHP 8.0+ 안정 정렬같은 값의 원래 순서가 보장됨 — 이전 버전은 불안정 정렬이었음
SORT_NUMERIC 플래그sort($arr, SORT_NUMERIC) — 문자열 숫자 혼재 시 수치 비교 강제
정렬 전 백업 권장sort()는 원본 변경 — 원래 순서 필요 시 $backup = $arr로 복사 후 정렬
선택 기준 요약일반 배열 오름차순=sort() / 내림차순=rsort() / 연관배열 오름차순=asort() / 키순=ksort()
Tags
#PHP #sort #오름차순 #배열정렬 #인덱스재배치 #array #print_r #정렬함수 #숫자정렬 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, sort, 오름차순, 배열정렬, 인덱스재배치, array, print_r, 정렬함수, 숫자정렬, PHP함수
댓글