PHP에서 날짜 배열 정렬하기
PHP에서 날짜 문자열로 구성된 배열을 정렬하려면 usort() 함수와 strtotime() 함수를 함께 활용하면 됩니다. usort()는 개발자가 직접 정의한 비교 함수를 기준으로 배열을 정렬해 주며, strtotime()은 'YYYY-MM-DD' 형식의 날짜 문자열을 유닉스 타임스탬프(정수)로 변환해 주기 때문에 숫자 비교 방식으로 날짜의 선후 관계를 쉽게 판단할 수 있습니다.
예제 1: 날짜 오름차순 정렬 (오래된 날짜 → 최근 날짜)
<?php
function compareDates($date1, $date2){
return strtotime($date1) - strtotime($date2);
}
$dateArr = array("2019-11-11", "2019-10-10", "2019-08-10", "2019-09-08");
usort($dateArr, "compareDates");
print_r($dateArr);
?>위 코드를 실행하면 다음과 같이 날짜가 빠른 순서부터 차례대로 정렬된 결과를 확인할 수 있습니다.
Array
(
[0] => 2019-08-10
[1] => 2019-09-08
[2] => 2019-10-10
[3] => 2019-11-11
)동작 원리: compareDates 함수는 두 날짜를 각각 타임스탬프로 변환한 뒤 그 차이를 반환합니다. 반환값이 음수이면 첫 번째 날짜가 앞으로, 양수이면 두 번째 날짜가 앞으로 배치되어 최종적으로 오름차순 정렬이 완성됩니다.
예제 2: 날짜 내림차순 정렬 (최근 날짜 → 오래된 날짜)
정렬 방향을 반대로 바꾸고 싶다면 비교 함수의 반환 조건만 뒤집어 주면 됩니다.
<?php
function compareDates($date1, $date2){
if (strtotime($date1) < strtotime($date2))
return 1;
else if (strtotime($date1) > strtotime($date2))
return -1;
else
return 0;
}
$dateArr = array("2019-11-11", "2019-10-10", "2019-11-11", "2019-09-08", "2019-05-11", "2019-01-01");
usort($dateArr, "compareDates");
print_r($dateArr);
?>실행 결과는 다음과 같습니다. 같은 날짜가 여러 개 있어도 중복 값이 그대로 유지되면서 정렬되는 점을 확인할 수 있습니다.
Array
(
[0] => 2019-11-11
[1] => 2019-11-11
[2] => 2019-10-10
[3] => 2019-09-08
[4] => 2019-05-11
[5] => 2019-01-01
)참고 사항
- usort()는 배열의 키(key)를 보존하지 않고 인덱스를 새로 매기므로, 키-값 연관 배열을 다룰 때는 uasort()를 사용하는 것이 좋습니다.
- PHP 7.4 이상에서는 화살표 함수(fn)를 사용해
usort($arr, fn($a, $b) => strtotime($a) <=> strtotime($b))처럼 더 간결하게 작성할 수도 있습니다.