PHP에서 연도, 월, 일이 각각 별도의 문자열로 주어져 있을 때, 이 값들을 조합하여 특정 기준 날짜보다 이후에 해당하는 가장 가까운 날짜를 찾아야 하는 경우가 있습니다. 이 문제는 세 개의 foreach 반복문을 중첩시켜 손쉽게 해결할 수 있습니다.
해결 접근 방식
기본 아이디어는 다음과 같습니다.
- 쉼표(,)로 구분된 연도, 월, 일 문자열을
explode()함수로 각각 배열로 변환합니다. - 세 개의 반복문을 중첩하여 연도 → 월 → 일 순서로 가능한 모든 날짜 조합을 생성합니다.
- 생성된 날짜 문자열('YYYY-MM-DD' 형식)이 기준 날짜보다 크면 해당 값을 변수에 저장하고
break 3;으로 모든 반복문을 한 번에 종료합니다.
여기서 break 3;은 현재 반복문뿐 아니라 바깥쪽 3개의 반복문까지 모두 탈출하라는 의미입니다. 덕분에 원하는 날짜를 찾는 즉시 불필요한 반복을 멈추고 효율적으로 코드를 마칠 수 있습니다.
예제 코드
<!DOCTYPE html>
<html>
<body>
<?php
$givenDate = '2018-04-28';
$fiveYears = '2018,2019,2020,2021,2022';
$fiveMonths = '03,05,07,08,09';
$fiveDays = '25,26,27,28,29';
$fYears = explode(',', $fiveYears);
$fMonths = explode(',', $fiveMonths);
$fDays = explode(',', $fiveDays);
$nextDate = null;
foreach($fYears as $yr) {
foreach($fMonths as $mn) {
foreach($fDays as $dy) {
$t = $yr.'-'.$mn.'-'.$dy;
if($t > $givenDate) {
$nextDate = $t;
break 3;
}
}
}
}
if($nextDate) {
echo '다음 날짜 값은 = ' . $nextDate;
}
else {
echo '날짜를 찾지 못했습니다.';
}
?>
</body>
</html>실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
다음 날짜 값은 =2018-05-25
코드 동작 원리
기준 날짜는 2018-04-28입니다. 반복문은 연도 2018부터 시작해 월 03, 일 25부터 차례대로 조합을 시도합니다. '2018-03-25'부터 '2018-03-29'까지는 기준 날짜보다 작으므로 건너뛰고, 월이 05가 되어 '2018-05-25'가 만들어지는 순간 처음으로 기준 날짜보다 커지므로 이 값이 최종 결과로 저장됩니다.
참고로 이 코드가 정상적으로 동작하는 이유는 'YYYY-MM-DD' 형식의 날짜 문자열이 사전순(lexicographic) 비교만으로도 시간순 비교와 동일한 결과를 내기 때문입니다. 실무에서는 DateTime 클래스나 strtotime() 함수를 활용하면 더 다양한 형식과 유효성 검사까지 안전하게 처리할 수 있습니다.