실무에서 숨 쉬듯 쓰이는 문자열과 배열 함수
1. 왜 내장 함수를 알아야 할까요?
PHP 엔진 안에는 이미 전 세계 천재 개발자들이 최적화해 둔 수천 개의 '내장 함수(Built-in Functions)'가 들어있습니다. 우리가 며칠을 끙끙대며 수십 줄짜리 반복문을 짜야 할 복잡한 데이터 처리도, 이미 누군가 만들어 둔 내장 함수 단 한 줄이면 0.001초 만에 끝나는 경우가 허다합니다.
이 수많은 함수를 영어 단어장 보듯 달달 외울 필요는 전혀 없습니다. "이런 기능도 PHP에 기본으로 있었지!"라는 감만 잡아두고, 나중에 실무에서 구글링을 통해 찾아 쓸 수 있으면 충분합니다. 이번 강좌에서는 현업에서 하루에도 수십 번씩 치게 되는 핵심 함수들만 쏙쏙 뽑아 정리해 드리겠습니다.
2. 문자열(String)을 요리하는 함수들
① 문자열 길이와 검색
<?php
$str = '안녕하세요, PHP 세계!';
// 길이 재기
strlen($str); // 한글은 1글자를 3바이트로 쳐서 길이를 뻥튀기합니다. (결과: 24)
mb_strlen($str); // 한글을 정확히 1글자로 셉니다. (결과: 13)
// 검색하기 (PHP 8.0 이상부터 지원되는 직관적인 함수들)
str_contains($str, 'PHP'); // 'PHP'라는 단어가 포함되어 있는가? (결과: true)
str_starts_with($str, '안녕'); // '안녕'으로 시작하는가? (결과: true)
str_ends_with($str, '세계!'); // '세계!'로 끝나는가? (결과: true)
// 위치 찾기 (없으면 false 반환)
mb_strpos($str, 'PHP'); // 앞에서부터 몇 번째 글자에 'PHP'가 시작되는지 찾습니다. (결과: 7)
② 문자열 변형 (자르기, 합치기, 바꾸기)
<?php
// 1. 공백 청소기
$str = ' Hello, World! ';
trim($str); // 양쪽 끝의 쓸데없는 띄어쓰기(공백)를 날려줍니다. 폼 데이터 받을 때 무조건 씁니다.
// 2. 단어 바꾸기
str_replace('World', 'PHP', 'Hello, World!'); // 출력: Hello, PHP!
str_replace(['a', 'e', 'i'], '*', 'apple pie'); // 여러 글자를 한 번에 '*'로 치환
// 3. 자르기 (앞에서 2번째 글자부터 3글자만 잘라내라)
mb_substr('안녕하세요', 2, 3); // 출력: 하세요
// 4. 문자열 쪼개서 배열로 만들기 (CSV 쉼표 분리 등에 자주 씁니다)
$parts = explode(',', '사과,바나나,포도'); // 결과: ['사과', '바나나', '포도']
// 5. 배열을 하나로 합치기
implode(' / ', $parts); // 결과: '사과 / 바나나 / 포도'
③ 형식 맞추기와 보안
<?php
// 1. 돈(금액) 예쁘게 찍기 (세 자리마다 쉼표 찍기)
number_format(1234567); // 출력: 1,234,567
// 2. 내가 원하는 틀(Format)에 값 끼워 넣기
sprintf('이름: %s, 나이: %d세', '홍길동', 30); // 출력: 이름: 홍길동, 나이: 30세
// 3. 보안의 핵심: HTML 특수문자 무력화 (XSS 방어용)
$name = '<script>alert("해킹")</script>';
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
// 출력: <script>alert("해킹")</script>
3. 배열(Array)을 주무르는 함수들
PHP는 배열을 다루는 데 있어서 세상 어느 언어보다 강력하고 유연합니다.
① 기본적인 조작과 확인
<?php
$fruits = ['사과', '바나나', '포도'];
count($fruits); // 배열 안에 데이터가 몇 개 들어있는가? (결과: 3)
in_array('바나나', $fruits); // 바나나가 이 배열 안에 있는가? (결과: true)
array_key_exists('age', ['name' => '홍길동']); // 'age'라는 이름표(키)가 존재하는가? (결과: false)
// 배열의 맨 끝에 데이터 쑤셔 넣기
array_push($fruits, '딸기', '수박');
② 검색과 정렬
<?php
$numbers = [3, 1, 4, 1, 5, 9];
// 원본 배열 자체를 정렬해 버립니다. (리턴값이 아닙니다!)
sort($numbers); // 오름차순 (1, 1, 3, 4, 5, 9)
rsort($numbers); // 내림차순 (9, 5, 4, 3, 1, 1)
// 중복된 값을 싹 지워버립니다.
array_unique([1, 2, 2, 3, 3, 3]); // 결과: [1, 2, 3]
// 배열의 순서를 거꾸로 뒤집습니다.
array_reverse([1, 2, 3]); // 결과: [3, 2, 1]
③ 실무 필살기: array_column
데이터베이스에서 가져온 복잡한 2차원 배열(회원 목록 등)에서 특정 세로줄(Column)만 쫙 뽑아낼 때 쓰는 기가 막힌 함수입니다.
<?php
$users = [
['id' => 1, 'name' => '홍길동', 'age' => 30],
['id' => 2, 'name' => '김철수', 'age' => 25]
];
// 회원 목록에서 'name'들만 뽑아서 새로운 1차원 배열로 만들어라!
$names = array_column($users, 'name');
// 결과: ['홍길동', '김철수']
4. 고차 함수 (함수형 프로그래밍 스타일)
배열의 모든 원소를 대상으로 반복문(foreach)을 돌리지 않고도, 일괄적으로 어떤 작업(함수)을 적용할 때 사용합니다.
<?php
$numbers = [1, 2, 3, 4, 5];
// array_map: 배열의 모든 요소에 각각 곱하기 2를 실행해서 새 배열을 만듭니다.
$doubled = array_map(fn($n) => $n * 2, $numbers);
// 결과: [2, 4, 6, 8, 10]
// array_filter: 주어진 조건이 참(true)인 데이터만 거름망처럼 걸러냅니다. (짝수만 추출)
$evens = array_filter($numbers, fn($n) => $n % 2 === 0);
// 결과: [2, 4]
꿀팁: 빈 데이터 청소하기
폼에서 넘어온 데이터 중에 빈칸이나 null 값이 섞여 있을 때,array_filter()에 아무 함수도 안 주고 그냥 돌리면, 알아서 텅 빈 쓰레기 값들을 깔끔하게 걸러내어 줍니다.$clean = array_filter(['홍길동', '', null, '김철수', 0]); // 결과: ['홍길동', '김철수']
5. 내가 직접 규칙 정하기: usort
쇼핑몰에서 상품을 '가격순', '인기순' 등 복잡한 조건으로 정렬해야 할 때 사용합니다. 앞서 배운 우주선 연산자(<=>)와 찰떡궁합입니다.
<?php
$users = [
['name' => '홍길동', 'age' => 30],
['name' => '막내', 'age' => 15],
['name' => '김철수', 'age' => 25],
];
// "각 배열 안의 'age' 값을 기준으로 비교해서 오름차순으로 줄을 세워라!"
usort($users, fn($a, $b) => $a['age'] <=> $b['age']);
// 결과: 막내(15) -> 김철수(25) -> 홍길동(30) 순으로 원본 배열이 재배치됩니다.
마치며
다시 한번 강조하지만, 이 수많은 함수들의 스펠링이나 괄호 안에 뭐가 들어가는지를 지금 당장 백지에 쓸 수 있을 필요는 없습니다. 프로그래머의 진짜 실력은 "아, 맞다! PHP에 배열에서 빈 값을 싹 걸러주는 함수가 있었는데?"라고 떠올린 뒤, 공식 메뉴얼(php.net)에서 검색해 찾아 쓰는 능력에 있습니다.