sort($array)는 배열을 그 자리에서 오름차순으로 정렬합니다. 넘긴 변수를 바꾸고 true를 반환하므로, 한 줄에 단독으로 호출한 다음 배열을 쓰세요. rsort()는 내림차순으로 정렬합니다.
PHP에는 "값 또는 키", "오름차순 또는 내림차순", "키 유지 여부"의 조합마다 정렬 함수가 있습니다.
| 함수 | 기준 | 순서 | 키 |
|---|---|---|---|
sort | 값 | 오름차순 | 0, 1, 2로 다시 매김 |
rsort | 값 | 내림차순 | 다시 매김 |
asort | 값 | 오름차순 | 유지 |
arsort | 값 | 내림차순 | 유지 |
ksort | 키 | 오름차순 | 유지 |
krsort | 키 | 내림차순 | 유지 |
usort | 직접 만든 함수 | 원하는 대로 | 다시 매김 |
uasort | 직접 만든 함수 | 원하는 대로 | 유지 |
uksort | 키에 대한 직접 만든 함수 | 원하는 대로 | 유지 |
연관 배열을 값으로 정렬하기
연관 배열에 sort()를 쓰면 키가 버려집니다. 값으로 정렬하면서 각 키를 값과 함께 유지하려면 asort()를, 큰 값부터 정렬하려면 arsort()를 쓰세요.
ksort로 배열을 키로 정렬하기
ksort()는 키 순서로, krsort()는 키의 역순으로 정렬합니다. 설정을 출력하거나 쿼리 문자열을 일정한 순서로 만들기 전에 편리합니다.
usort와 우주선 연산자로 원하는 순서 만들기
usort($array, $callback)는 순서를 직접 정하게 해 줍니다. 콜백은 요소 두 개를 받아, 첫 번째가 앞에 와야 하면 음수를, 두 번째가 앞에 와야 하면 양수를, 같으면 0을 반환합니다. 우주선 연산자 <=>가 정확히 그것을 반환합니다.
banana와 cherry는 길이가 같으므로 콜백이 0을 반환하고, 둘은 원래 순서를 유지합니다. PHP 8.0부터 PHP의 정렬은 안정적입니다. 같은 요소는 이전 순서를 유지합니다.
다차원 배열을 값으로 정렬하기
행 목록을 필드 하나로 정렬하려면 usort에서 그 필드를 비교하세요. 두 필드로 정렬하려면 배열을 비교하세요. <=>는 배열을 요소별로 비교하므로 두 번째 필드는 첫 번째 필드가 같을 때만 순서를 정합니다.
두 번째 비교는 $b["age"]를 왼쪽에, $a["age"]를 오른쪽에 두어 나이 순서만 뒤집습니다. array_multisort(array_column($people, 'city'), SORT_ASC, array_column($people, 'age'), SORT_DESC, $people)는 콜백 없이 같은 순서를 만듭니다. 뽑아낸 열로 정렬하고 그에 맞게 $people의 순서를 바꿉니다.
자연 정렬과 정렬 플래그
기본적으로 PHP는 숫자는 숫자로, 문자열은 문자열로 비교합니다. 숫자가 들어간 파일 이름은 사람이 예상하지 않는 방식으로 정렬됩니다. img10이 img2보다 앞에 오고, 대문자로 시작하는 이름이 모두 소문자 이름보다 앞에 옵니다. 플래그는 값을 비교하는 방법을 바꿉니다.
SORT_NATURAL은 연속된 숫자를 수로 읽고, SORT_FLAG_CASE는 대소문자를 무시하며, SORT_STRING은 숫자 문자열이라도 문자 단위 비교를 강제합니다. natsort()와 natcasesort()는 같은 아이디어지만 키를 유지합니다.
흔한 실수: sort의 결과를 대입하기
모든 정렬 함수는 true를 반환하고 넘긴 배열을 바꿉니다. 반환값을 대입하면 배열을 잃습니다.
원본을 유지한 채 정렬된 복사본이 필요하다면, 위의 asort 예제가 $copy로 하듯 먼저 배열을 새 변수에 복사하고 복사본을 정렬하세요.
자주 묻는 질문
sort()가 정렬된 배열 대신 true를 반환하는 이유는 무엇인가요?
PHP의 정렬 함수는 참조를 통해 배열을 그 자리에서 정렬하고 true를 반환합니다. sort($arr);를 한 줄에 단독으로 호출하고 그 뒤에 $arr를 쓰세요. $arr = sort($arr);라고 쓰면 배열이 true로 바뀝니다.
키를 유지하면서 연관 배열을 값으로 정렬하려면 어떻게 하나요?
오름차순은 asort($arr), 내림차순은 arsort($arr)를 쓰세요. sort()와 rsort()도 값으로 정렬하지만 키를 버리고 0부터 번호를 다시 매깁니다.
PHP에서 다차원 배열을 값으로 정렬하려면 어떻게 하나요?
필드에 우주선 연산자를 쓰는 usort를 쓰세요: usort($rows, fn($a, $b) => $a['age'] <=> $b['age']);. 내림차순은 $a와 $b를 바꾸고, 두 필드로 정렬하려면 [$a['city'], $a['age']] <=> [$b['city'], $b['age']]처럼 배열을 비교하세요.
PHP 정렬은 안정 정렬인가요?
네, PHP 8.0부터 모든 정렬 함수가 안정적입니다. 같다고 비교되는 요소는 정렬 전의 순서를 유지합니다. 그래서 한 필드로 정렬한 다음 다른 필드로 정렬하는 것이 예상대로 동작합니다.
숫자가 들어간 문자열을 자연스러운 순서로 정렬하려면 어떻게 하나요?
natsort($arr)나 sort($arr, SORT_NATURAL)을 쓰면 img2가 img10보다 앞에 옵니다. 대소문자를 무시하려면 SORT_FLAG_CASE(SORT_NATURAL | SORT_FLAG_CASE)를 추가하거나 natcasesort를 쓰세요.