Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP에서 날짜 배열 정렬하기 – usort와 strtotime 완벽 가이드

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))처럼 더 간결하게 작성할 수도 있습니다.