PHP의 array_multisort() 함수를 활용하면 다차원 배열을 여러 개의 키를 기준으로 정렬할 수 있습니다. 각 키마다 오름차순(SORT_ASC) 또는 내림차순(SORT_DESC)을 개별적으로 지정할 수 있어, 실무에서 자주 필요한 복합 정렬 조건도 손쉽게 처리할 수 있습니다.
예제 코드
다음 예제는 event_type을 기준으로 내림차순 정렬한 뒤, 값이 동일한 경우에는 title을 기준으로 오름차순 정렬하는 방식입니다.
$my_list = array(
array('ID' => 1, 'title' => 'data one', 'event_type' => 'one'),
array('ID' => 2, 'title' => 'data two', 'event_type' => 'zero'),
array('ID' => 3, 'title' => 'data three', 'event_type' => 'one'),
array('ID' => 4, 'title' => 'data four', 'event_type' => 'zero')
);
# 정렬에 사용할 열 데이터를 추출해 별도 배열로 준비합니다.
$sort = array();
foreach($my_list as $k=>$v) {
$sort['title'][$k] = $v['title'];
$sort['event_type'][$k] = $v['event_type'];
}
# event_type은 내림차순, title은 오름차순으로 정렬합니다.
array_multisort($sort['event_type'], SORT_DESC, $sort['title'], SORT_ASC, $my_list);동작 원리를 살펴보면, 먼저 foreach 문으로 각 배열 요소에서 정렬 기준이 될 열(title, event_type)의 값만 추출해 별도의 배열을 만듭니다. 이후 이 배열들을 우선순위 순서대로 array_multisort() 함수에 전달하면, 마지막 인자로 넘긴 원본 배열이 해당 정렬 순서에 맞춰 재배열됩니다.
PHP 5.5.0 이상에서 더 간결하게 작성하기
PHP 5.5.0부터 제공되는 array_column() 함수를 사용하면 반복문 없이 특정 열의 값만 한 번에 추출할 수 있습니다. 이를 활용하면 위 코드를 훨씬 간단하게 줄일 수 있습니다.
array_multisort(array_column($my_list, 'event_type'), SORT_DESC, array_column($my_list, 'title'), SORT_ASC, $my_list);
실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
array (
0 =>
array (
'ID' => 4,
'title' => 'data four',
'event_type' => 'zero',
),
1 =>
array (
'ID' => 3,
'title' => 'data two',
'event_type' => 'zero',
),
2 =>
array (
'ID' => 1,
'title' => 'data one',
'event_type' => 'one',
),
3 =>
array (
'ID' => 2,
'title' => 'data three',
'event_type' => 'one',
),
)