PHP에서 explode() 함수로 문자열을 나누면 구분자가 연달아 등장할 경우 빈 문자열이 배열 요소로 포함됩니다. 예를 들어 입력값이 ",abc,defg,,,hijk,lmnop,,0,,"처럼 되어 있다면 불필요한 빈 값이 여러 개 생깁니다. 이럴 때 array_filter() 함수 또는 preg_split()의 PREG_SPLIT_NO_EMPTY 옵션을 활용하면 빈 값을 손쉽게 제거할 수 있습니다.
방법 1: array_filter() 기본 사용
array_filter()를 콜백 없이 호출하면 배열의 각 요소를 불리언 값으로 평가하여 거짓(false)인 요소를 모두 제거합니다.
주의: PHP에서는 문자열 "0"이 불리언으로 변환되면 false이기 때문에, 유효한 데이터인 "0"까지 함께 삭제된다는 점에 유의해야 합니다.
<?php
$_POST['tag'] = ",abc,defg,,,hijk,lmnop,,0,,";
// 콜백 없이 호출하면 각 요소를 불리언으로 평가 → (bool)"0"은 false이므로 "0"도 제거됨
$tags = array_filter( explode(",", $_POST['tag']) );
var_dump($tags);
방법 2: array_filter()에 strlen 콜백 지정
array_filter()의 두 번째 인수로 'strlen'을 전달하면 각 요소의 문자열 길이를 기준으로 필터링합니다. 길이가 0보다 큰 값은 모두 참으로 평가되므로 "0" 같은 데이터도 안전하게 유지됩니다.
// strlen을 콜백으로 지정하면 길이가 있는 문자열은 모두 유지 → "0" 보존
$tags = array_filter( explode(",", $_POST['tag']), 'strlen' );
var_dump($tags);
방법 3: preg_split() + PREG_SPLIT_NO_EMPTY
preg_split()에 PREG_SPLIT_NO_EMPTY 플래그를 사용하면 분할 단계에서 빈 문자열을 아예 생성하지 않습니다. 별도의 후처리 없이 가장 깔끔하게 처리할 수 있으며, 결과 배열의 인덱스도 0부터 순차적으로 재정렬됩니다.
// 분할 과정에서 빈 문자열을 생성하지 않음
$tags = preg_split('/,/', $_POST['tag'], -1, PREG_SPLIT_NO_EMPTY);
var_dump($tags);
실행 결과
세 가지 방법의 출력 결과는 다음과 같습니다.
--- 방법 1: array_filter ----
array(4) {
[1]=> string(3) "abc"
[2]=> string(4) "defg"
[5]=> string(4) "hijk"
[6]=> string(5) "lmnop"
}
--- 방법 2: array_filter + strlen ----
array(5) {
[1]=> string(3) "abc"
[2]=> string(4) "defg"
[5]=> string(4) "hijk"
[6]=> string(5) "lmnop"
[8]=> string(1) "0"
}
--- 방법 3: PREG_SPLIT_NO_EMPTY ----
array(5) {
[0]=> string(3) "abc"
[1]=> string(4) "defg"
[2]=> string(4) "hijk"
[3]=> string(5) "lmnop"
[4]=> string(1) "0"
}
어떤 방법을 선택해야 할까?
- 가장 간결한 처리:
preg_split()+PREG_SPLIT_NO_EMPTY조합은 후처리 없이 한 번에 해결되고 인덱스도 0부터 재정렬됩니다. - "0" 값을 보존해야 할 때:
array_filter()에는 반드시'strlen'콜백을 함께 지정해야 합니다. - 배열 키 유지 문제: 방법 1과 2는 원본 배열의 키가 그대로 남으므로, 인덱스를 다시 정렬하려면
array_values($tags)를 적용하세요. - 공백 제거: 공백만 있는 요소까지 제거하려면
array_map('trim', ...)으로 먼저 다듬은 뒤 필터링하는 것이 좋습니다.