name="hobby[]"로 여러 값을 배열로 받고, implode()로 문자열로 합치는 흐름을 완전히 이해한다
시작 오늘 분석할 코드
체크박스는 여러 항목을 동시에 선택할 수 있다. 그래서 하나의 name으로 여러 값을 보내야 한다. PHP는 name 끝에 []를 붙이면 이 값들을 배열로 자동 수집한다.
form.html — 체크박스 폼
<FORMname="form1"method="post"action="view.php"> 나의 취미:<BR><INPUTtype="checkbox"name="hobby[]"value="스포츠">스포츠<BR>// checkbox이기 때문에 name key를 배열로 만들어줌<INPUTtype="checkbox"name="hobby[]"value="영화감상">영화감상<BR><INPUTtype="checkbox"name="hobby[]"value="독서">독서<BR><INPUTtype="submit"value="송신"></FORM>
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()과 완전히 같다 (별칭 관계). 구분자를 어떻게 쓰느냐에 따라 출력 형태가 달라진다.
댓글