for ($i = 0; $i < 5; $i++) { ... }는 블록을 정해진 횟수만큼 실행합니다. 세 부분은 시작($i = 0, 한 번 실행), 조건($i < 5, 매 회차 전에 확인), 증감($i++, 매 회차 후에 실행)입니다. 조건이 거짓이 되는 즉시 반복이 끝납니다.
$i는 반복문이 끝난 뒤에도 남아 있으며, 조건을 거짓으로 만든 값(6)을 가집니다. PHP에는 반복 변수를 위한 블록 스코프가 없습니다.
인덱스로 배열 순회하기
키가 0, 1, 2 ...인 리스트에서는 카운터가 곧 인덱스입니다. 매 회차마다 다시 호출하지 않도록 count()를 먼저 변수에 저장하세요.
첫 번째 부분에는 쉼표로 구분한 여러 표현식을 넣을 수 있으며, 그래서 $n = count($fruits)가 한 번만 설정됩니다. 각 값만 필요하고 이웃 요소가 필요 없다면 foreach가 더 짧고, 키가 0부터 n - 1까지가 아닌 배열에서도 동작합니다.
거꾸로 세기와 1보다 큰 간격
증감식에는 어떤 표현식이든 올 수 있습니다. 거꾸로 세려면 $i--, 두 번째 수마다는 $i += 2, 2의 거듭제곱은 $i *= 2입니다.
range('a', 'h')는 배열 ['a', 'b', ... 'h']를 만듭니다. range(1, 10)과 foreach를 쓰면 for문과 같은 카운트를 얻지만, 먼저 배열 전체를 만드는 비용이 듭니다.
break와 continue
break는 반복문을 바로 끝냅니다. continue는 현재 회차의 나머지를 건너뛰고 증감식과 다음 조건 확인으로 넘어갑니다.
두 번째 반복문은 조건이 비어 있는데, 이는 "항상 참"을 뜻하므로 break까지 실행됩니다. 중첩 반복문에서 break 2와 continue 2는 바깥 반복문에 작용하며, 다음 예제에서 볼 수 있습니다.
중첩 for문: 구구단 표
반복문 안의 반복문은 바깥 반복문의 회차마다 안쪽 반복문을 끝까지 실행합니다. 여기서는 출력이 HTML이므로 Page 탭에 실제 표가 나타납니다.
$size를 12로 바꾸고 다시 실행해 보세요. for (...):와 endfor; 형태는 HTML 태그 사이에서 반복문을 읽기 쉽게 해 주는 대체 문법입니다. 같은 표를 일반 텍스트로 만들고, break 2로 두 반복문을 함께 멈추는 예제입니다.
흔한 실수: 하나 차이 오류와 무한 루프
for문의 대표적인 버그 두 가지입니다. count()와 함께 <=를 쓰면 끝에서 한 칸 더 읽게 되며, PHP는 이를 Warning: Undefined array key 3으로 알리고 null로 취급합니다. 그리고 카운터를 끝 쪽으로 움직이지 않는 증감식($i++를 의도했는데 $i--를 쓴 경우)은 조건을 영원히 참으로 유지합니다.
파일 끝까지 읽기처럼 반복 횟수를 미리 알 수 없는 경우에는 while 반복문이 더 잘 맞습니다.
자주 묻는 질문
PHP에서 인덱스로 배열을 순회하려면 어떻게 하나요?
키가 0, 1, 2인 리스트라면 for ($i = 0; $i < count($arr); $i++) { echo $arr[$i]; }를 쓰세요. 대부분의 코드에서는 foreach ($arr as $i => $value)가 더 간단하고, 같은 인덱스를 주며, 키가 0부터 n-1까지가 아닐 때도 동작합니다.
PHP에서 for문을 빠져나오려면 어떻게 하나요?
break;는 반복문을 즉시 빠져나옵니다. 중첩 반복문에서 break 2;는 안쪽 반복문과 그것을 감싼 반복문을 함께 빠져나옵니다. continue;는 현재 회차의 나머지를 건너뛰고 다음 회차로 넘어갑니다.
PHP for문으로 거꾸로 세려면 어떻게 하나요?
큰 값에서 시작해 >=로 비교하고 감소시키세요: for ($i = 10; $i >= 1; $i--) { echo $i; }. 1이 아닌 간격이 필요하면 세 번째 부분을 바꾸세요. 예: $i += 2 또는 $i -= 5.
PHP에서 foreach 대신 for를 언제 써야 하나요?
무언가를 셀 때(5번 반복, 1부터 100까지의 수, 두 번째 요소마다) 또는 인덱스로 다음이나 이전 요소가 필요할 때 for를 쓰세요. 배열의 모든 요소를 방문할 때, 특히 숫자 인덱스가 없는 연관 배열에는 foreach를 쓰세요.