
1. PHP 배열(Array)이란 무엇인가?
배열의 정의 및 필요성 배열은 하나의 변수에 여러 개의 값을 순차적 혹은 논리적으로 저장하는 특수한 변수입니다. 일반 변수가 하나의 상자에 물건 하나를 담는 것이라면, 배열은 칸막이가 있는 큰 수납장과 같습니다. 수백 명의 사용자 데이터를 $user1, $user2처럼 선언하는 대신, 하나의 배열 변수에 담음으로써 코드의 가독성과 관리 효율성을 획기적으로 높일 수 있습니다.
배열의 구조적 특징 PHP의 배열은 사실 내부적으로 키(Key)와 값(Value)의 쌍으로 이루어진 '맵(Map)'의 집합입니다. 이 키를 숫자로 쓰느냐, 문자열로 쓰느냐에 따라 인덱스 배열과 연관 배열로 구분되지만, 근본적으로는 데이터와 이를 식별하는 열쇠의 조합이라는 점이 핵심입니다.
--------------------------------------------------------------------------------
2. 인덱스 배열 (Indexed Array): 숫자로 관리하는 데이터
정의 및 특징 정수(숫자)를 키(인덱스)로 사용하는 가장 기본적인 형태입니다. PHP의 인덱스는 특별한 지정이 없다면 항상 0부터 시작합니다.
선언 및 초기화 전통적인 array() 함수 방식과 현대적인 짧은 배열 선언([]) 방식을 모두 지원합니다. 최근 실무에서는 가독성을 위해 대괄호 방식을 더 선호합니다.
// array() 함수 사용
$fruits = array("apple", "banana", "orange");
// [] 대괄호 사용 (PHP 5.4 이상 권장)
$colors = ["red", "green", "blue"];
데이터의 동적 생성 및 참조 PHP 배열의 큰 장점은 유연함입니다. 미리 배열을 선언하지 않더라도, 값을 할당하는 것만으로 배열이 자동으로 생성됩니다.
$arr[] = "first"; // 배열이 자동 생성되며 인덱스 0에 할당
$arr[] = "second"; // 자동으로 인덱스 1에 할당
echo $arr[0]; // "first" 출력
배열의 홀(Hole)과 주의사항 PHP에서는 특정 인덱스에만 값을 넣을 수 있습니다. 이때 값이 비어 있는 중간 인덱스들을 '홀(Hole)'이라고 합니다.
$data = [];
$data[10] = "target"; // 인덱스 0~9는 비어 있는 '홀' 상태
var_dump(isset($data[0])); // false (데이터 없음)
전문가의 조언: 홀이 있는 배열에서 count() 함수를 사용하면 실제 요소의 개수만 반환합니다. 위 예시에서 count($data)는 10이 아닌 1을 반환하므로, for 문을 사용해 인덱스로 접근할 경우 로직 오류가 발생할 확률이 매우 높습니다.
--------------------------------------------------------------------------------
3. 연관 배열 (Associative Array): 의미를 담은 키로 관리하는 데이터
정의 및 특징 숫자가 아닌 문자열을 키로 사용하여 데이터에 명확한 의미(이름, 가격 등)를 부여하는 방식입니다. 파이썬의 딕셔너리와 유사한 개념입니다.
선언 및 '=>' 연산자 활용 키와 값 사이를 => (이중 화살표) 연산자로 연결하여 초기화합니다.
$user = [
"name" => "John",
"age" => 30,
"job" => "Developer"
];
키의 타입 변환 규칙 (중요) PHP는 키값을 내부적으로 정수 또는 문자열로 강제 변환합니다. 이 규칙을 모르면 의도치 않은 데이터 덮어쓰기가 발생할 수 있습니다.
• 불리언(Boolean): true는 1, false는 0으로 변환됩니다.
• 실수(Float): 소수점이 버려진 정수로 변환됩니다. (예: 8.5 -> 8)
• 숫자 형식 문자열: "8"은 정수 8로 변환됩니다.
--------------------------------------------------------------------------------
4. 배열의 활용: 루프(Loop)를 통한 효율적 접근
for 문 vs foreach 문 인덱스 배열에서 순차적으로 접근할 때는 for 문을 쓸 수 있지만, 앞서 언급한 '배열의 홀'이나 연관 배열을 처리할 때는 foreach 문이 표준입니다. foreach는 배열의 내부 구조를 직접 따라가므로 홀을 건너뛰고 실제 데이터에만 정확히 접근합니다.
foreach 문 구문
// 1. 값만 가져오기
foreach ($array as $value) { /* 로직 */ }
// 2. 키와 값을 함께 가져오기
foreach ($array as $key => $value) { /* 로직 */ }
💡 실무 팁: 대체 구문 (Colon Syntax) HTML 템플릿 안에서 PHP 루프를 사용할 때는 가독성을 위해 아래와 같은 대체 구문을 자주 사용합니다.
<?php foreach ($items as $item): ?>
<li><?= $item ?></li>
<?php endforeach; ?>
참조 변수(&$value)와 원본 수정** 루프 내부에서 원본 배열의 값을 직접 수정해야 할 때는 참조 연산자(`&`)를 사용합니다. 단, 루프가 끝난 후에도 `$value변수가 배열의 마지막 요소를 참조하고 있어 이후 코드에서 버그를 유발할 수 있습니다. 따라서 **루프 직후unset($value);`를 호출하여 참조를 해제하는 것이 숙련된 개발자의 습관입니다.
foreach ($prices as &$value) {
$value = $value * 1.1; // 10% 인상
}
unset($value); // 루프 종료 후 반드시 참조 해제!
--------------------------------------------------------------------------------
5. 실무에 유용한 PHP 배열 주요 함수
실무에서 가장 빈번하게 사용되는 함수들을 카테고리별로 정리했습니다.
분류함수설명
|
정보 확인
|
count()
|
배열 요소의 개수 확인 (홀은 제외)
|
|
|
array_key_exists()
|
특정 키가 배열에 존재하는지 여부 확인
|
|
|
in_array()
|
특정 값이 배열에 존재하는지 여부 확인
|
|
추출 및 조작
|
array_keys() / array_values()
|
배열의 키 목록 또는 값 목록을 추출
|
|
|
array_column()
|
다차원 배열에서 특정 컬럼 값만 추출
|
|
|
array_unique()
|
배열 내의 중복된 값을 제거 (중요)
|
|
|
array_merge()
|
두 개 이상의 배열을 병합
|
|
|
unset()
|
특정 요소 또는 배열 자체를 삭제
|
|
정렬(Sorting)
|
sort() / rsort()
|
값 기준 오름차순/내림차순. 기존 키 파괴(재인덱싱)
|
|
|
asort() / arsort()
|
값 기준 오름차순/내림차순. 기존 키 유지
|
|
|
ksort() / krsort()
|
키(Key)를 기준으로 오름차순/내림차순 정렬
|
--------------------------------------------------------------------------------
6. 데이터 통신의 가교: JSON 변환
PHP 배열은 API 통신 시 JSON 포맷으로 변환되어 전달되는 경우가 많습니다.
• json_encode($array): PHP 배열을 JSON 문자열로 변환합니다.
• json_decode($json, true): JSON 문자열을 PHP 배열로 변환합니다.
전문가 팁: json_decode()의 두 번째 인자를 생략하거나 false로 두면 PHP 객체(stdClass)로 반환됩니다. 우리가 익숙한 연관 배열 형태로 다루려면 반드시 true를 전달해야 합니다.
--------------------------------------------------------------------------------
7. 요약 및 마무리
• 인덱스 배열: 숫자를 키로 쓰며, 순서가 중요한 데이터에 적합합니다. (Hole 발생 시 주의 필요)
• 연관 배열: 문자열을 키로 쓰며, 데이터의 의미를 담아야 할 때 필수적입니다.
'Backend > Php' 카테고리의 다른 글
| 복잡한 조건문은 이제 그만! PHP switch-case로 깔끔하게 분기하기 (0) | 2026.02.17 |
|---|---|
| 조건문 if...else: 상황에 따라 다르게 동작하는 스마트한 코드 만들기 (0) | 2026.02.17 |
| 산술부터 논리까지: PHP 연산자로 코드에 계산 능력 부여하기 (0) | 2026.02.17 |
| 문자열의 마술: PHP에서 큰따옴표와 작은따옴표의 결정적 차이 (0) | 2026.02.16 |
| 절대 변하지 않는 값, PHP 상수의 선언과 활용 (define vs const) (0) | 2026.02.16 |
