배열은 여러 값을 담는 상자다
웹 애플리케이션은 대부분 여러 개의 값을 다룹니다. 게시글 목록, 회원 정보, 장바구니 상품, 설정 값처럼 하나의 값만으로는 표현하기 어려운 데이터가 많습니다. 이때 사용하는 것이 배열입니다.
배열은 여러 값을 하나의 변수에 담는 자료형입니다. PHP의 배열은 두 가지 방식으로 자주 사용합니다.
첫째, 순서가 중요한 인덱스 배열입니다. 값마다 0부터 시작하는 번호가 붙습니다.
<?php
$fruits = ['사과', '바나나', '포도'];
echo $fruits[0]; // 사과
echo $fruits[1]; // 바나나둘째, 이름으로 값을 꺼내는 연관 배열입니다. 번호 대신 의미 있는 키를 사용합니다.
<?php
$user = [
'name' => '민수',
'email' => '[email protected]',
'age' => 25,
];
echo $user['name']; // 민수
echo $user['email']; // [email protected]인덱스 배열은 목록에 적합합니다. 과일 목록, 상품 목록, 검색 결과처럼 같은 종류의 값이 여러 개 있을 때 사용합니다. 연관 배열은 하나의 대상을 설명할 때 좋습니다. 사용자 한 명, 게시글 하나, 설정 하나처럼 각 값의 의미가 분명할 때 사용합니다.
배열을 화면에 출력할 때는 보통 foreach를 사용합니다. 사용자에게 보여 주는 값에는 이전에 배운 것처럼 htmlspecialchars()를 적용합니다.
<?php
$menus = ['홈', '게시판', '로그인'];
?>
<ul>
<?php foreach ($menus as $menu): ?>
<li><?= htmlspecialchars($menu, ENT_QUOTES, 'UTF-8') ?></li>
<?php endforeach; ?>
</ul>foreach ($menus as $menu)는 $menus 배열에서 값을 하나씩 꺼내 $menu에 담아 반복합니다. 배열과 반복문은 거의 항상 함께 쓰입니다.
AI 생성 이미지
다차원 배열로 실제 데이터 표현하기
배열 안에 또 다른 배열을 넣을 수 있습니다. 이것을 다차원 배열이라고 합니다. 이름은 어렵지만 구조는 단순합니다. 게시글 하나가 연관 배열이라면, 게시글 여러 개는 그 연관 배열들을 담은 인덱스 배열입니다.
<?php
$posts = [
[
'id' => 1,
'title' => '첫 번째 글',
'author' => '민수',
'views' => 12,
],
[
'id' => 2,
'title' => 'PHP 배열 정리',
'author' => '지은',
'views' => 35,
],
[
'id' => 3,
'title' => '문자열 함수 연습',
'author' => '현우',
'views' => 8,
],
];이 구조는 나중에 데이터베이스에서 게시글 목록을 가져왔을 때 자주 보게 됩니다. 각 행은 연관 배열이고, 전체 결과는 배열입니다.
<table>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>조회수</th>
</tr>
<?php foreach ($posts as $post): ?>
<tr>
<td><?= $post['id'] ?></td>
<td><?= htmlspecialchars($post['title'], ENT_QUOTES, 'UTF-8') ?></td>
<td><?= htmlspecialchars($post['author'], ENT_QUOTES, 'UTF-8') ?></td>
<td><?= $post['views'] ?></td>
</tr>
<?php endforeach; ?>
</table>여기서 중요한 습관은 데이터 구조를 먼저 생각하는 것입니다. "게시글 하나에는 무엇이 필요한가?", "그 게시글들이 여러 개 모이면 어떤 모양인가?"를 생각하면 배열 설계가 쉬워집니다.
사용자 정보도 비슷하게 표현할 수 있습니다.
<?php
$users = [
['name' => '민수', 'role' => 'admin', 'active' => true],
['name' => '지은', 'role' => 'member', 'active' => true],
['name' => '현우', 'role' => 'member', 'active' => false],
];이런 구조는 로그인 사용자 목록, 권한 검사, 관리자 화면에서 자주 사용됩니다.
배열 함수로 값을 가공하기
반복문만으로도 배열을 처리할 수 있습니다. 하지만 PHP에는 배열을 더 짧고 분명하게 다루는 함수들이 있습니다. 처음에는 세 가지만 익혀도 충분합니다.
array_map()은 배열의 각 값을 바꿔 새 배열을 만듭니다.
<?php
$prices = [1000, 2000, 3000];
$formattedPrices = array_map(function ($price) {
return number_format($price) . '원';
}, $prices);
print_r($formattedPrices);
// Array
// (
// [0] => 1,000원
// [1] => 2,000원
// [2] => 3,000원
// )짧게 표현하고 싶을 때는 화살표 함수를 사용할 수도 있습니다.
<?php
$names = ['minsu', 'jieun', 'hyunwoo'];
$upperNames = array_map(
fn($name) => strtoupper($name),
$names
);array_filter()는 조건에 맞는 값만 남깁니다.
<?php
$posts = [
['title' => '첫 번째 글', 'views' => 12],
['title' => '인기 글', 'views' => 120],
['title' => '새 글', 'views' => 3],
];
$popularPosts = array_filter($posts, function ($post) {
return $post['views'] >= 50;
});주의할 점이 있습니다. array_filter()는 기존 배열의 키를 유지합니다. 인덱스를 0부터 다시 정리하고 싶다면 array_values()를 함께 사용합니다.
<?php
$popularPosts = array_values($popularPosts);array_reduce()는 배열 전체를 하나의 값으로 줄입니다. 합계, 총점, 평균 계산에 자주 사용합니다.
<?php
$cart = [
['name' => '키보드', 'price' => 30000, 'quantity' => 1],
['name' => '마우스', 'price' => 15000, 'quantity' => 2],
];
$total = array_reduce($cart, function ($sum, $item) {
return $sum + ($item['price'] * $item['quantity']);
}, 0);
echo $total; // 60000세 번째 인수 0은 시작값입니다. 시작값을 빼먹으면 빈 배열을 처리할 때 예상과 다른 결과가 나올 수 있으므로 넣는 습관이 좋습니다.
배열 함수는 코드를 짧게 만들지만, 무조건 좋은 것은 아닙니다. 처음 읽는 사람이 이해하기 어렵다면 foreach가 더 낫습니다. 기준은 "짧은가"가 아니라 "의도가 잘 보이는가"입니다.
문자열은 사용자의 말을 다루는 기본 도구다
웹 페이지는 결국 많은 문자열을 다룹니다. 이름, 이메일, 검색어, 게시글 제목, URL, 오류 메시지는 모두 문자열입니다.
문자열을 이어 붙일 때는 . 연산자를 사용합니다.
<?php
$name = '민수';
$message = '안녕하세요, ' . $name . '님';
echo $message;큰따옴표 안에서는 변수 값을 바로 넣을 수 있습니다.
<?php
$name = '민수';
$message = "안녕하세요, {$name}님";간단한 문자열은 어느 쪽을 써도 됩니다. 다만 변수와 일반 글자가 붙어 있으면 {$name}처럼 중괄호로 감싸는 편이 안전합니다.
사용자 입력을 다룰 때는 앞뒤 공백을 제거하는 trim()이 자주 쓰입니다.
<?php
$keyword = trim(' php 기초 ');
// 'php 기초'문자열 안에 특정 단어가 있는지 확인할 때는 PHP 8부터 사용할 수 있는 str_contains()가 편리합니다.
<?php
$title = 'PHP 문자열 함수 연습';
if (str_contains($title, 'PHP')) {
echo 'PHP 관련 글입니다.';
}문자열을 바꿀 때는 str_replace()를 사용합니다.
<?php
$content = 'PHP는 어렵다.';
$content = str_replace('어렵다', '재미있다', $content);
echo $content; // PHP는 재미있다.문자열을 나눌 때는 explode(), 배열을 문자열로 합칠 때는 implode()를 사용합니다.
<?php
$tagText = 'php,web,backend';
$tags = explode(',', $tagText);
// ['php', 'web', 'backend']
$path = implode(' / ', ['홈', '게시판', '글 보기']);
// 홈 / 게시판 / 글 보기이 함수들은 태그 입력, CSV 형태의 간단한 데이터, 경로 표시, 검색 조건 처리에서 자주 만납니다.
한글 문자열과 멀티바이트 함수
영어 알파벳은 보통 한 글자를 1바이트로 표현합니다. 하지만 한글은 한 글자가 여러 바이트로 저장됩니다. 그래서 일반 문자열 함수만 사용하면 한글에서 결과가 어긋날 수 있습니다.
예를 들어 strlen()은 글자 수가 아니라 바이트 수를 반환합니다.
<?php
echo strlen('PHP'); // 3
echo strlen('한글'); // UTF-8에서는 보통 6사람이 생각하는 글자 수를 구하려면 mb_strlen()을 사용합니다.
<?php
echo mb_strlen('한글', 'UTF-8'); // 2문자열 일부를 자를 때도 한글은 substr()보다 mb_substr()이 안전합니다.
<?php
$title = 'PHP 문자열 다루기';
$shortTitle = mb_substr($title, 0, 6, 'UTF-8');
echo $shortTitle;검색도 마찬가지입니다. 한글이 포함된 문자열을 다룰 때는 mb_strpos() 같은 멀티바이트 함수를 고려합니다. mb_로 시작하는 함수들은 여러 바이트로 이루어진 문자를 제대로 처리하기 위한 함수입니다.
만약 mb_strlen() 같은 함수가 없다는 오류가 나온다면 PHP의 mbstring 확장이 활성화되어 있는지 확인해야 합니다. 대부분의 학습용 통합 환경에서는 기본으로 켜져 있지만, 서버 환경에 따라 직접 설치하거나 활성화해야 할 수 있습니다.
실무에서는 파일 저장 방식, HTML 문서, 데이터베이스 연결이 모두 UTF-8로 맞춰져야 한글 깨짐을 줄일 수 있습니다. 이 책의 예제도 UTF-8을 기준으로 설명합니다.
작은 기능 만들기: 게시글 검색과 제목 줄이기
배열과 문자열을 함께 사용해 간단한 게시글 검색 기능을 만들어 보겠습니다.
<?php
$posts = [
['title' => 'PHP 배열 기초', 'author' => '민수'],
['title' => '문자열 함수 정리', 'author' => '지은'],
['title' => '웹 개발 입문', 'author' => '현우'],
];
$keyword = trim($_GET['keyword'] ?? '');
$filteredPosts = array_filter($posts, function ($post) use ($keyword) {
if ($keyword === '') {
return true;
}
return mb_strpos($post['title'], $keyword, 0, 'UTF-8') !== false;
});
?>
<form method="get">
<input type="text" name="keyword" value="<?= htmlspecialchars($keyword, ENT_QUOTES, 'UTF-8') ?>">
<button type="submit">검색</button>
</form>
<ul>
<?php foreach ($filteredPosts as $post): ?>
<?php
$title = $post['title'];
$shortTitle = mb_strlen($title, 'UTF-8') > 10
? mb_substr($title, 0, 10, 'UTF-8') . '...'
: $title;
?>
<li>
<?= htmlspecialchars($shortTitle, ENT_QUOTES, 'UTF-8') ?>
- <?= htmlspecialchars($post['author'], ENT_QUOTES, 'UTF-8') ?>
</li>
<?php endforeach; ?>
</ul>이 예제에는 중요한 흐름이 들어 있습니다.
$_GET['keyword'] ?? ''로 검색어가 없을 때 기본값을 정합니다.trim()으로 앞뒤 공백을 제거합니다.array_filter()로 조건에 맞는 게시글만 남깁니다.mb_strpos()로 한글 검색을 처리합니다.mb_strlen()과mb_substr()로 제목을 적당히 줄입니다.화면에 출력할 때는
htmlspecialchars()를 사용합니다.
이 정도만 익혀도 작은 목록 화면, 검색 화면, 관리자 페이지를 만들 때 필요한 기본 처리를 시작할 수 있습니다.
실습 과제
상품 목록을 배열로 만들고 상품명, 가격, 재고를 HTML 표로 출력해 보세요.
array_filter()를 사용해 재고가 1개 이상인 상품만 출력해 보세요.array_reduce()를 사용해 모든 상품의 총 재고 금액을 계산해 보세요. 재고 금액은가격 * 재고입니다.쉼표로 입력된 문자열
'php, mysql, html, css'를 배열로 나누고, 각 값의 앞뒤 공백을 제거해 보세요.한글 제목이 15글자를 넘으면
mb_substr()로 줄이고 뒤에...을 붙여 보세요.
자주 발생하는 오류 점검
없는 키를 읽는 경우
<?php
echo $user['phone'];phone 키가 없으면 경고가 발생할 수 있습니다. 기본값이 필요하면 ?? 연산자를 사용합니다.
<?php
$phone = $user['phone'] ?? '전화번호 없음';인덱스 배열과 연관 배열을 헷갈리는 경우
<?php
$fruits = ['사과', '바나나'];
echo $fruits['name']; // 잘못된 접근인덱스 배열은 숫자 키로 접근합니다. 연관 배열은 직접 정한 문자열 키로 접근합니다.
array_filter() 후 인덱스가 비는 경우
array_filter()는 원래 키를 유지합니다. JSON으로 응답하거나 순서가 중요한 처리를 할 때는 array_values()로 다시 정리할 수 있습니다.
strlen()으로 한글 글자 수를 세는 경우
strlen('한글')은 2가 아닐 수 있습니다. 한글 글자 수가 필요하면 mb_strlen('한글', 'UTF-8')을 사용합니다.
사용자 입력을 그대로 출력하는 경우
검색어, 이름, 제목처럼 사용자가 입력한 문자열을 HTML에 그대로 출력하면 보안 문제가 생길 수 있습니다. 출력 직전에는 htmlspecialchars()를 적용하는 습관을 유지하세요.
배열은 여러 데이터를 구조화하고, 문자열은 사용자의 입력과 화면의 문장을 다룹니다. 이 둘을 익히면 PHP로 웹 페이지를 만드는 감각이 훨씬 분명해집니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.