본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP 체크박스 배열 — name[] + implode() 완전 정리

by 왕진 2026. 7. 7.
반응형

 

 

Web Development · PHP Form

체크박스 배열 + implode() — PHP 폼 처리 완전 정리

name="hobby[]"로 여러 값을 배열로 받고, implode()로 문자열로 합치는 흐름을 완전히 이해한다
시작 오늘 분석할 코드

체크박스는 여러 항목을 동시에 선택할 수 있다. 그래서 하나의 name으로 여러 값을 보내야 한다. PHP는 name 끝에 []를 붙이면 이 값들을 배열로 자동 수집한다.

form.html — 체크박스 폼
<FORM name="form1" method="post" action="view.php"> 나의 취미:<BR> <INPUT type="checkbox" name="hobby[]" value="스포츠">스포츠<BR> // checkbox이기 때문에 name key를 배열로 만들어줌 <INPUT type="checkbox" name="hobby[]" value="영화감상">영화감상<BR> <INPUT type="checkbox" name="hobby[]" value="독서">독서<BR> <INPUT type="submit" value="송신"> </FORM>
view.php — 수신 처리
<?php if(isset($_POST["hobby"])){ $hobby = implode('와 ', $_POST["hobby"]); // implode — 배열을 문자열로 변경해주는 함수 print "저의 취미는 "; print $hobby; print "입니다."; }else{ print "저의 취미는 없습니다."; } ?>
실제 출력 미리보기
▼ 폼 화면 (form.html)
텍스트 송신 테스트
나의 취미:
스포츠
영화감상
독서
▼ 결과 화면 (view.php) — 스포츠, 독서 체크 시
저의 취미는 스포츠와 독서입니다.
용어 핵심 용어 정리
name="hobby[]"끝에 []를 붙이면 PHP가 같은 name의 값들을 배열로 수집함
$_POSTPOST 방식으로 전송된 폼 데이터를 담는 PHP 슈퍼글로벌 배열
implode()배열 원소들을 구분자로 이어 붙여 하나의 문자열로 반환하는 함수
isset()변수 또는 배열 키가 존재하고 null이 아닌지 확인하는 함수
checkboxHTML input type. 체크된 항목만 서버로 전송됨 (미체크 시 키 자체가 없음)
value 속성체크 시 서버로 전송될 실제 데이터 값. 화면 라벨과 별개로 지정
배열 인덱스hobby[]로 전송된 값은 $_POST["hobby"][0], [1]... 형태로 자동 인덱싱
구분자(glue)implode 첫 번째 인수. '와 ', ', ', ' | ' 등 원하는 문자열 지정 가능

1 체크박스는 왜 배열이 필요한가
같은 name으로 여러 값이 동시에 오는 문제

텍스트 입력이나 라디오버튼은 항상 값이 하나다. 하지만 체크박스는 여러 개를 동시에 선택할 수 있다. 만약 세 체크박스 모두 name="hobby"라고 쓰면, PHP는 마지막 하나의 값만 받는다 — 앞선 값들이 덮어쓰여지기 때문이다.

name="hobby[]"처럼 대괄호를 붙이면 PHP는 같은 name의 값들을 배열로 누적해서 $_POST["hobby"]에 담는다. HTML 입장에서는 관례적인 표기이고, PHP 서버 측에서 이를 배열로 해석하는 것이다.

[]는 PHP의 약속이다. Ruby on Rails는 같은 목적으로 name="hobby[]"를, Java 서블릿은 request.getParameterValues()를 사용한다.
name="hobby" (배열 없음)
스포츠, 영화감상, 독서 모두 체크
$_POST["hobby"] = "독서"

마지막 값만 남음. 앞 두 개 소실
name="hobby[]" (배열)
스포츠, 영화감상, 독서 모두 체크
$_POST["hobby"]
= ["스포츠","영화감상","독서"]

세 값 모두 보존

2 name="hobby[]" 문법 완전 분석
브라우저가 만드는 전송 데이터의 실체

브라우저는 폼을 전송할 때 체크된 항목들을 hobby[]=스포츠&hobby[]=독서 형태의 쿼리 문자열로 묶어 HTTP POST body에 담는다. PHP가 이 패턴을 보고 $_POST["hobby"]를 인덱스 배열로 구성한다.

// 스포츠, 독서 두 개 체크 시 실제 전송 원문 (URL 인코딩 전): hobby[]=스포츠&hobby[]=독서 // PHP가 파싱하면: $_POST["hobby"] = [ 0 => "스포츠", 1 => "독서" ]; // 개별 접근: $_POST["hobby"][0] // "스포츠" $_POST["hobby"][1] // "독서" count($_POST["hobby"]) // 2
[] 안에 숫자나 문자를 넣어 키를 직접 지정할 수 있다 (name="hobby[0]", name="hobby[sports]"). 비워두면 PHP가 0부터 자동 인덱싱한다.

3 isset()으로 미선택 상황 처리
체크박스는 미체크 시 데이터 자체가 없다

텍스트 input은 아무것도 입력 안 해도 $_POST["name"] = ""처럼 빈 문자열이 온다. 반면 체크박스는 하나도 선택하지 않으면 그 키 자체가 $_POST에 존재하지 않는다. 그래서 isset() 없이 바로 $_POST["hobby"]에 접근하면 경고가 발생한다.

// 올바른 패턴 if(isset($_POST["hobby"])){ // 최소 하나 이상 체크된 경우만 진입 $hobby = implode('와 ', $_POST["hobby"]); print "저의 취미는 " . $hobby . "입니다."; }else{ print "저의 취미는 없습니다."; } // 잘못된 패턴 (아무것도 체크 안 하면 경고 발생) $hobby = implode('와 ', $_POST["hobby"]); // ❌ Undefined index
⚠ isset() 없이 직접 접근하면 "Notice: Undefined index: hobby" 경고. 개발 환경에서는 화면에 표시될 수 있고, 운영 환경에서는 에러 로그가 쌓인다.

 

반응형

 

4 implode() 함수 동작 원리
배열 → 문자열 변환의 모든 것

implode(구분자, 배열)은 배열의 원소들을 구분자로 이어 붙인 하나의 문자열을 반환한다. PHP 내장 함수 join()과 완전히 같다 (별칭 관계). 구분자를 어떻게 쓰느냐에 따라 출력 형태가 달라진다.

$arr = ["스포츠", "영화감상", "독서"]; implode('와 ', $arr); // "스포츠와 영화감상와 독서" implode(', ', $arr); // "스포츠, 영화감상, 독서" implode(' | ', $arr); // "스포츠 | 영화감상 | 독서" implode('', $arr); // "스포츠영화감상독서" (구분자 없음) join(', ', $arr); // implode와 동일 (별칭)
반대 함수: explode()
  • explode(구분자, 문자열) — 문자열을 구분자로 쪼개 배열로 반환
  • explode(', ', "사과, 배, 포도")["사과","배","포도"]
  • implode ↔ explode는 서로 역함수 관계

5 POST 전송 전체 흐름
form.html에서 view.php까지 데이터 여정
1
사용자가 체크박스 선택 후 송신 버튼 클릭 브라우저가 체크된 항목의 value만 수집. 미체크 항목은 전송 데이터에 포함되지 않음
2
브라우저가 HTTP POST 요청 생성 body에 hobby[]=스포츠&hobby[]=독서 형태로 인코딩하여 action="view.php"로 전송
3
PHP 서버가 요청 수신 후 파싱 POST body를 파싱해서 $_POST["hobby"] = ["스포츠","독서"]로 구성. 서버 측 스크립트 실행 시작
4
isset() 분기 → implode() 처리 → 출력 배열을 문자열로 변환 후 print로 출력. PHP가 HTML을 생성하고 브라우저로 응답
form.html
체크박스 UI
HTTP POST
hobby[]=값&...
$_POST["hobby"]
배열 수신
implode()
배열→문자열
view.php
결과 출력

6 자주 하는 실수
실수 증상 해결
name="hobby" ([] 없음) 여러 개 체크해도 마지막 값 하나만 전달됨 모든 체크박스에 name="hobby[]"로 수정
isset() 없이 직접 $_POST["hobby"] 접근 아무것도 체크 안 하면 "Undefined index" 경고 if(isset($_POST["hobby"]))로 존재 확인 후 접근
value 속성 없이 체크박스 생성 체크 시 "on"이라는 문자열이 전송됨 (의도한 값 아님) 각 체크박스에 value="스포츠" 등 실제 값 명시
implode 결과를 배열로 착각해서 foreach 사용 "Warning: Invalid argument supplied for foreach()" implode는 문자열 반환. foreach는 implode 전 원본 배열에 사용
임의로 배열 인덱스 가정 ($_POST["hobby"][0]) 체크 순서가 바뀌거나 첫 항목이 미체크면 예상과 다른 값 인덱스 직접 접근 대신 implode 또는 foreach로 순회

핵심 한 줄 요약

name="hobby[]"같은 name의 여러 값을 배열로 수집하는 PHP 관례
$_POST["hobby"]체크된 항목의 value만 담긴 배열 (미체크 항목은 포함 안 됨)
isset() 필수체크박스는 미선택 시 키 자체가 없으므로 접근 전 반드시 존재 확인
implode(구분자, 배열)배열 → 하나의 문자열. explode()의 반대 방향

Tags

#PHP #체크박스 #checkbox #배열폼 #implode #isset #$_POST #다중선택 #폼처리 #웹개발
▼ 티스토리 태그 입력란 복사용
PHP, 체크박스, checkbox, 배열폼, implode, isset, $_POST, 다중선택, 폼처리, 웹개발
반응형

댓글