개발하다 보면 주문번호, 영수증번호, 송장번호 같은 ID를 생성할 때 항상 같은 자릿수로 맞춰야 한다. 예를 들어 1번 주문을 "000001"로 표시하고, 10000번 주문을 "010000"으로 만들어야 하는데, 이걸 제대로 모르면 문자열 함수들을 잔뜩 조합해서 복잡하게 처리한다. 다만 대부분의 개발자들은 PHP가 이걸 위해 만든 str_pad() 함수의 정확한 동작 원리를 모른 채 인터넷에서 복사한 코드를 그냥 붙여 넣는다. 이번에는 str_pad()가 정확히 뭔지, 왜 필요한지, 어떻게 써야 하는지 완벽하게 정리해서 소개하겠다.
기본 문법:
str_pad(string $string, int $length, string $pad_string = " ", int $pad_type = STR_PAD_RIGHT): string
파라미터 설명:
$string: 원본 문자열$length: 최종 문자열이 되어야 할 길이(자릿수)$pad_string: 채울 문자 또는 문자열 (기본값: 공백)$pad_type: 패딩 방식 (STR_PAD_RIGHT=오른쪽, STR_PAD_LEFT=왼쪽, STR_PAD_BOTH=양쪽)
실제로는 숫자 앞에 0을 붙이는 경우가 대부분이므로, STR_PAD_LEFT와 '0'이 가장 자주 쓰인다.
<?php
$order_id = 42;
$formatted = str_pad($order_id, 6, '0', STR_PAD_LEFT);
echo $formatted; // 출력: "000042"
$order_id = 100000;
$formatted = str_pad($order_id, 6, '0', STR_PAD_LEFT);
echo $formatted; // 출력: "100000" (이미 6자리 이상이면 그대로)
?>
동작 원리: 원본 문자열이 지정된 길이보다 짧으면, 왼쪽(앞)에 '0'을 붙여서 총 6자리로 만든다. 이미 6자리 이상이면 아무것도 추가하지 않는다.
<?php
$phone = "01012345";
$formatted = str_pad($phone, 11, '0', STR_PAD_RIGHT);
echo $formatted; // 출력: "01012345000"
?>
동작 원리: 오른쪽(뒤)에 문자를 추가한다. 전화번호를 정렬할 때 가끔 쓰인다.
<?php
$text = "INFO";
$formatted = str_pad($text, 10, '*', STR_PAD_BOTH);
echo $formatted; // 출력: "***INFO***" (양쪽에 각각 3개씩)
?>
동작 원리: 길이가 짝수가 될 때까지 양쪽에 균등하게 문자를 추가한다. 디버깅 메시지 강조할 때 유용하다.
<?php
// 데이터베이스에서 AUTO_INCREMENT로 생성된 ID
$order_id = 5; // 5번째 주문
$date = date('Ymd'); // 20250115
$formatted_id = str_pad($order_id, 6, '0', STR_PAD_LEFT);
$order_number = $date . '-' . $formatted_id;
echo $order_number; // 출력: "20250115-000005"
?>
<?php
// 2자리 문자를 채울 때 (예: "--" 반복)
$receipt_id = 3;
$receipt_number = str_pad($receipt_id, 6, '-', STR_PAD_LEFT);
echo $receipt_number; // 출력: "-----3"
// 하지만 단일 문자만 권장됨
// 여러 문자를 넣으면 예상 결과와 다를 수 있음
$receipt_id = 3;
$receipt_number = str_pad($receipt_id, 6, '0', STR_PAD_LEFT);
echo $receipt_number; // 출력: "000003" (권장)
?>
<?php
$order_ids = [1, 15, 100, 5432];
$formatted_ids = array_map(function($id) {
return str_pad($id, 6, '0', STR_PAD_LEFT);
}, $order_ids);
print_r($formatted_ids);
// 출력:
// Array
// (
// [0] => 000001
// [1] => 000015
// [2] => 000100
// [3] => 005432
// )
?>
<?php
// 이렇게 하면 안 됨 - 복잡하고 유지보수 어려움
$order_id = 42;
$formatted = '';
for ($i = 0; $i < 6 - strlen($order_id); $i++) {
$formatted .= '0';
}
$formatted .= $order_id;
echo $formatted; // 출력: "000042" (작동하지만 비효율적)
?>
문제점: 루프를 돌려서 문자를 하나씩 붙이는 방식은 느리고, 코드 가독성도 떨어진다.
<?php
$order_id = 42;
$formatted = str_pad($order_id, 6, '0', STR_PAD_LEFT);
echo $formatted; // 출력: "000042"
?>
장점: 한 줄에 간결하게 처리되고, PHP가 최적화한 C 함수로 실행되어 빠르다.
<?php
$order_id = 42;
$formatted = sprintf('%06d', $order_id); // 6자리 정수, 앞에 0으로 채우기
echo $formatted; // 출력: "000042"
?>
장점: 숫자 형식 지정에는 sprintf()도 좋다. '%06d'는 "6자리 정수, 부족분은 0으로"라는 뜻이다.
<?php
$order_id = 1234567; // 이미 7자리
$formatted = str_pad($order_id, 6, '0', STR_PAD_LEFT);
echo $formatted; // 출력: "1234567" (자리가 넘으면 원본 유지)
// 강제로 자릿수를 맞추고 싶다면 substr() 병합
$formatted = substr(str_pad($order_id, 6, '0', STR_PAD_LEFT), -6);
echo $formatted; // 출력: "234567" (오른쪽에서 6자리만 추출)
?>
중요: str_pad()는 문자열을 늘리기만 하고 자르지는 않는다. 자릿수를 초과하면 원본이 그대로 반환된다.
<?php
// 재사용 가능한 서포트 함수
function format_order_number($order_id, $length = 6) {
return str_pad($order_id, $length, '0', STR_PAD_LEFT);
}
function format_receipt_number($receipt_id, $date = null) {
$date = $date ?? date('Ymd');
$formatted_id = str_pad($receipt_id, 6, '0', STR_PAD_LEFT);
return $date . '-' . $formatted_id;
}
// 사용
echo format_order_number(42); // 출력: "000042"
echo format_receipt_number(15); // 출력: "20250115-000015"
echo format_receipt_number(15, '20240101'); // 출력: "20240101-000015"
?>
str_pad()는 주문번호, 영수증번호, 송장번호 같은 ID를 일관된 형식으로 만드는 데 매우 유용하다. 한 줄의 간단한 함수 호출로 복잡한 문자열 조작 코드를 제거할 수 있다는 점을 잊지 말자. 이 글의 실무 예제 섹션을 참고해서 자신의 프로젝트에 str_pad()를 직접 적용하면, 데이터 포매팅 코드의 가독성과 유지보수성을 크게 향상시킬 수 있을 것이다.