시작 오늘 분석할 코드
asort()는 연관 배열을 값(value) 기준 오름차순으로 정렬하되 키를 그대로 유지한다. a는 associative(연관)의 약자다. sort()와 달리 정렬 후에도 TV1, TV2, RADIO1 같은 키가 각 값과 함께 보존된다.
<?php $sales = array("TV2" => "1000", "TV1" => "500", "RADIO1" => "800"); asort($sales); // 주석에 "내림차순"이라고 적혀있으나 asort()는 오름차순(값 작은 것 먼저)! print "<PRE>"; print_r($sales); print "</PRE>"; ?>
⚠ 원본 코드 주석에 "내림차순 정렬"이라고 적혀 있지만 asort()는 오름차순(작은 값 먼저)이다. a는 내림차순 아닌 associative(연관)의 약자다. 내림차순은 arsort()를 사용한다.
정렬 전
Array
(
[TV2] => 1000
[TV1] => 500
[RADIO1] => 800
)
→
asort() 후 (값 오름차순, 키 보존)
Array
(
[TV1] => 500
[RADIO1] => 800
[TV2] => 1000
)
값(500 → 800 → 1000) 오름차순 / TV1·RADIO1·TV2 키 보존
용어 핵심 용어 정리
asort()Associative Sort — 연관 배열 값 기준 오름차순 정렬, 키 보존
연관 배열문자열 키와 값을 쌍으로 가진 배열 — "TV1" => "500" 형태
키 보존정렬 후에도 TV1, RADIO1, TV2 키가 각 값과 함께 유지됨
값 기준 정렬500, 800, 1000 값의 크기로 순서 결정 — 키 이름은 정렬 기준에 영향 없음
arsort()asort()의 반대 — 값 기준 내림차순 정렬, 키 보존
ksort()키 기준 오름차순 정렬 — RADIO1 → TV1 → TV2 순 (알파벳순)
sort() 차이sort()는 키를 0,1,2로 재배치 — 연관 배열에 쓰면 키 정보 소실
문자열 값 비교"500", "800", "1000"은 문자열이지만 숫자 비교로 처리됨 (기본 동작)
1 sort() vs asort() — 키 보존의 차이
sort() — 키 소실
$sales = ["TV2"=>"1000","TV1"=>"500","RADIO1"=>"800"];
sort($sales);
// Array ( [0]=>"500" [1]=>"800" [2]=>"1000" )
// TV1, TV2, RADIO1 키 모두 소실!
asort() — 키 보존
$sales = ["TV2"=>"1000","TV1"=>"500","RADIO1"=>"800"];
asort($sales);
// Array ( [TV1]=>"500" [RADIO1]=>"800" [TV2]=>"1000" )
// 제품명(키)이 가격(값)과 함께 유지!
2 a로 시작하는 정렬 함수들 — 공통점과 차이
a(associative) 접두사가 붙은 함수들은 모두 연관 배열의 키를 유지하며 값으로 정렬한다. 방향만 다르다.
| 함수 |
정렬 기준 |
방향 |
키 보존 |
사용 예 |
asort() |
값(value) |
오름차순 (500 → 1000) |
예 |
가격 낮은 순 목록 |
arsort() |
값(value) |
내림차순 (1000 → 500) |
예 |
가격 높은 순 목록 |
ksort() |
키(key) |
오름차순 (RADIO1 → TV1 → TV2) |
예 |
제품코드 사전순 정렬 |
krsort() |
키(key) |
내림차순 (TV2 → TV1 → RADIO1) |
예 |
제품코드 역순 정렬 |
3 asort() 활용 — 연관 배열로 데이터 정렬 후 표 출력
asort()는 DB없이 PHP 배열만으로 가격 목록, 점수 순위 등을 값 기준 오름차순으로 정렬해 표로 출력할 때 유용하다. 키(제품코드)와 값(가격)이 함께 유지되므로 foreach 순회 시 제품명과 가격 모두 접근 가능하다.
$sales = array("TV2"=>"1000", "TV1"=>"500", "RADIO1"=>"800"); asort($sales); foreach ($sales as $product => $price) { print "$product: $price 원<br>"; } // TV1: 500 원 // RADIO1: 800 원 // TV2: 1000 원 // sort()를 쓰면 키가 사라져 제품명과 가격 연결 불가 sort($sales); foreach ($sales as $idx => $price) { print "$idx: $price 원<br>"; } // 0: 500 원 ← 어떤 제품인지 알 수 없음!
4 문자열 값의 숫자 비교 — 주의점
$sales의 값 "1000", "500", "800"은 문자열이다. PHP asort()는 기본적으로 이런 문자열을 숫자로 변환해 비교한다. 하지만 문자열로 비교하면 사전순이 되어 순서가 달라질 수 있다. 명시적 플래그로 제어할 수 있다.
// 기본값 (숫자처럼 처리) asort($sales); // 500 → 800 → 1000 (수치 비교) // 명시적 문자열 비교 (SORT_STRING) asort($sales, SORT_STRING); // "1000" → "500" → "800" (사전순: 1 < 5 < 8) // 문자열 사전순에서 "1000"이 "500"보다 앞에 옴!
※ 수치 정렬이 필요하면 값을 문자열이 아닌 정수로 선언하거나, SORT_NUMERIC 플래그를 명시하는 것이 안전하다.
5 asort() 후 첫 번째 key-value 쌍 읽기 — reset() + key() + current()
asort() 후 배열 포인터는 내부적으로 재설정된다. 첫 번째 요소(최소값)를 바로 읽으려면 reset()으로 포인터를 처음으로 되돌린 뒤 key()와 current()로 키와 값을 각각 읽는다.
$sales = array("TV2"=>"1000", "TV1"=>"500", "RADIO1"=>"800"); asort($sales); reset($sales); // 포인터를 첫 번째 요소로 이동 $min_key = key($sales); // "TV1" (가장 낮은 가격의 제품코드) $min_val = current($sales); // "500" (가장 낮은 가격) print "최저가: $min_key - $min_val 원"; // 최저가: TV1 - 500 원
※ 또는 foreach로 첫 번째 반복만 실행하고 break해도 같은 결과를 얻을 수 있다. PHP 8.0+에서는 array_key_first()와 array_key_last()로 첫/마지막 키를 바로 가져올 수 있다.
6 asort()와 uasort() — 사용자 정의 비교와의 차이
asort()는 PHP 기본 비교 방식으로 값을 정렬한다. 복잡한 기준(예: 문자열 길이 순)으로 키를 유지하며 정렬하려면 uasort()를 사용한다. u = user-defined(사용자 정의) + a = associative(키 보존)의 조합이다.
// 문자열 길이 오름차순 + 키 보존 $products = array("TV2"=>"텔레비전", "R1"=>"라디오", "TV10"=>"OLED TV"); uasort($products, function($a, $b) { return mb_strlen($a) - mb_strlen($b); // 길이 오름차순 }); // R1 => 라디오(3자), TV2 => 텔레비전(4자), TV10 => OLED TV(7자) // 제품 코드(키) 보존됨
※ 교육 단계에서는 asort()로 기본 값 오름차순을 먼저 익힌다. 복잡한 정렬이 필요할 때 uasort() / usort() / arsort() 중 적합한 것을 선택하면 된다.
7 PHP 배열 정렬 선택 가이드
6가지 기본 정렬 함수를 배열 타입과 방향에 따라 한눈에 볼 수 있는 기준표이다. asort()는 "연관 배열 + 값 기준 + 오름차순"에 해당한다.
| 배열 타입 |
오름차순 |
내림차순 |
| 일반 배열 (인덱스 0,1,2) |
sort() |
rsort() |
| 연관 배열 (값 기준) |
asort() ← 오늘 |
arsort() |
| 연관 배열 (키 기준) |
ksort() |
krsort() |
※ "연관 배열 + 값 기준" 정렬이 필요하면 asort()가 기본이다. 높은 것 먼저 보여줘야 하면 arsort(), 제품코드 순으로 나열해야 하면 ksort()를 선택한다.
8 자주 하는 실수
| 실수 |
증상 |
해결 |
| asort와 arsort 방향 혼동 |
오름차순이 필요한 곳에 arsort 사용 — 순서 반대 |
asort = 오름차순(작은 먼저), arsort = 내림차순(큰 먼저) |
| 숫자 인덱스 배열에 asort 사용 |
동작하지만 인덱스(0,1,2)가 보존되어 순서와 인덱스 불일치 |
숫자 인덱스 배열은 sort() 사용이 직관적 |
| 문자열 값을 사전순으로 정렬 시 의도와 다른 결과 |
"1000" < "500" (사전순) vs 500 < 1000 (수치) |
SORT_NUMERIC 플래그 명시 or 정수 타입으로 선언 |
| asort() 반환값 사용 |
asort()는 bool 반환 — $result = asort($arr)은 true 저장 |
asort($arr); 후 $arr 자체를 사용 |
💡 asort()를 처음 접하면 "a가 ascending(오름차순)의 약자 아닌가?" 혼동이 생긴다. a는 associative(연관)의 약자다. 방향(오름/내림)은 별도로 기억해야 한다: asort = 오름차순, arsort = 내림차순(ar = associative + reverse).
// 빠른 기억 공식 sort() → 숫자 인덱스 배열 오름차순 (키 0,1,2 재배치) rsort() → 숫자 인덱스 배열 내림차순 (키 0,1,2 재배치) asort() → 연관 배열 값 오름차순 (TV1, TV2 키 보존) arsort() → 연관 배열 값 내림차순 (TV1, TV2 키 보존) ksort() → 연관 배열 키 오름차순 (TV1, TV2 키 보존) krsort() → 연관 배열 키 내림차순 (TV1, TV2 키 보존)
핵심 한 줄 요약
asort()연관 배열 값 기준 오름차순 + 키 보존 — a = associative의 약자
sort() vs asort()sort()는 키 재배치(0,1,2), asort()는 원래 키(TV1, TV2) 유지
arsort()asort()의 반대 방향 — 값 기준 내림차순, 키 보존
문자열 숫자 비교기본적으로 숫자 변환 비교 — 사전순이 필요하면 SORT_STRING 플래그 명시
foreach + asort()정렬 후 foreach ($sales as $product => $price) — 키와 값 모두 접근 가능
uasort()사용자 정의 기준 + 키 보존 정렬 — u(user) + a(associative) 조합
reset() + key()asort() 후 reset($arr); key($arr) → 최소값의 키(제품코드) 바로 접근
array_key_first() (PHP 7.3+)asort() 후 array_key_first($arr) → 정렬된 첫 번째 키 반환
a = associative (not ascending)a는 오름차순(ascending)이 아닌 연관(associative)의 약자 — arsort는 ar = associative+reverse
6함수 선택 요약일반↑=sort / 일반↓=rsort / 연관값↑=asort / 연관값↓=arsort / 연관키↑=ksort / 연관키↓=krsort
SORT_NUMERIC 권장문자열 숫자 값("500","800")은 asort($arr, SORT_NUMERIC)으로 명시적 수치 비교 권장
원본 .md 주석 오류원본 코드에 "내림차순 정렬" 주석이 있으나 asort()는 오름차순 — 실제 동작 기준으로 설명
보관 vs 재배치asort는 키 보관(TV1 유지) / sort는 키 재배치(0으로 변경) — 키 의미가 있으면 asort
PHP 8.0+ 안정 정렬asort()도 PHP 8.0부터 안정 정렬 — 같은 값 가진 요소들 원래 순서 보장
연관 배열 정렬 3법칙값↑=asort / 값↓=arsort / 키↑=ksort / 키↓=krsort — 모두 키 보존
Tags
#PHP #asort #연관배열 #키보존 #오름차순 #sort #값정렬 #배열정렬 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, asort, 연관배열, 키보존, 오름차순, sort, 값정렬, 배열정렬, PHP함수, PHP학습
댓글