Menu

PHP while문과 do while: 문법과 예제

while (조건) { ... }은 조건이 참인 동안 블록을 반복하며, 매 회차 전에 조건을 확인합니다. do { ... } while (조건);은 나중에 확인하므로 항상 한 번 이상 실행됩니다. break와 함께 쓰는 while (true), 파일을 한 줄씩 읽기, 무한 루프 피하기를 다룹니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

while (condition) { ... }은 조건이 참인 동안 블록을 계속 반복합니다. 조건은 매 회차 전에 확인되므로, 처음부터 거짓이면 본문은 한 번도 실행되지 않습니다. 반복문 안의 무언가가 조건을 바꿔야 하며, 그렇지 않으면 끝나지 않습니다.

이것이 바로 while이 만들어진 이유입니다. 반복 횟수는 미리 알 수 없고 언제 멈출지만 압니다. 이자율을 바꾸고 다시 실행해 보세요.

do while: 최소 한 번 실행

do { ... } while (condition);은 본문 다음에 조건을 확인하므로 본문이 항상 한 번 실행됩니다. 끝의 세미콜론에 주의하세요.

대표적인 용도는 "먼저 시도하고 확인하기"입니다. 6이 나올 때까지 주사위 굴리기, 사용되지 않은 코드가 나올 때까지 생성하기 같은 경우로, 확인할 대상이 생기려면 첫 시도가 먼저 있어야 합니다. 이 예제는 실행할 때마다 결과가 달라집니다.

break와 함께 쓰는 while (true)

종료 조건을 본문 중간에서 확인하는 편이 쉬울 때는 while (true)로 쓰고 break로 빠져나오세요. 다른 반복문과 마찬가지로 continue는 다음 확인으로 건너뜁니다.

array_shift()는 배열이 비면 null을 반환하며, 이것이 또 다른 탈출 방법입니다. 빈 배열은 거짓으로 취급되므로 같은 반복문을 while ($queue)로 쓸 수도 있습니다.

파일을 한 줄씩 읽기

fgets()는 한 번에 한 줄을 반환하고 파일 끝에서는 false를 반환하므로 while 반복문을 바로 이끌 수 있습니다. 이 블록은 먼저 파일을 쓴 다음 다시 읽습니다.

$line = fgets($handle)를 감싼 괄호가 중요합니다. 대입이 먼저 일어나고 그 결과를 false와 비교합니다. 단순한 참 거짓 확인 대신 !== false를 쓰면, 줄바꿈 없이 0만 담긴 마지막 줄이 반복문을 일찍 끝내는 일을 막을 수 있습니다. 파일 함수는 fopen() 페이지에서 다룹니다.

템플릿에서 endwhile과 함께 쓰는 while

if, for처럼 while에도 HTML용 콜론 형태가 있습니다: while (...):와 endwhile;. 이 예제는 Page 탭에 카운트다운 목록을 출력합니다.

흔한 실수: 끝나지 않는 반복문

카운터는 종료 쪽으로 움직여야 합니다. $i++를 빠뜨리거나 엉뚱한 변수를 바꾸면 조건이 영원히 참으로 남습니다. 웹 서버에서는 PHP가 max_execution_time(기본 30초) 후에 치명적 에러와 함께 스크립트를 멈춥니다. 명령줄에서는 멈추지 않습니다.

// Never ends: $i is never changed
$i = 0;
while ($i < 3) {
    echo $i;
}

호출 재시도나 결과 페이지 넘기기처럼 외부 데이터에 의존하는 반복문에는 안전 한도를 두는 것이 간단한 대비책입니다.

몇 번 실행해 보세요. 일찍 성공할 때도 있고 포기할 때도 있지만 항상 끝납니다. 반복 횟수를 미리 안다면 for 반복문이 시작, 끝, 간격을 한 줄에 나타내므로 실수하기 어렵습니다.

자주 묻는 질문

PHP에서 while과 do while의 차이는 무엇인가요?

while은 매 회차 전에 조건을 확인하므로 본문이 한 번도 실행되지 않을 수 있습니다. do { ... } while ($cond);는 매 회차 후에 확인하므로 본문이 항상 한 번 이상 실행됩니다. do while 조건 뒤의 세미콜론에 주의하세요.

PHP에서 무한 while 루프를 멈추려면 어떻게 하나요?

반복문 안에서 종료 조건을 만족할 때 break로 끝내세요: while (true) { ...; if ($done) { break; } }. 반복문에 break가 없고 조건이 거짓이 되지 않으면, 스크립트는 PHP의 max_execution_time이 멈출 때까지(웹 요청) 또는 영원히(명령줄) 실행됩니다.

PHP에서 for 대신 while을 언제 써야 하나요?

몇 번 반복해야 할지 모를 때 while을 쓰세요. 파일 끝까지 읽기, 성공할 때까지 재시도, 큐가 빌 때까지 처리 같은 경우입니다. 횟수를 셀 때는 for를, 배열의 모든 요소를 방문할 때는 foreach를 쓰세요.

PHP에 do until 반복문이 있나요?

없습니다. do while에서 종료 조건을 부정하세요: do { $n++; } while (!($n >= 3));는 $n >= 3이 참이 될 때까지 실행됩니다. until은 PHP 키워드가 아닙니다.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기