PHpullh

PHP · 심층 가이드

PHP 컬렉션 완전 정리

리스트와 해시맵을 한 타입으로 겸하는 PHP 배열의 성질을 짚고, array_map 계열과 정렬, 키 보존 규칙을 실제 데이터 가공 순서대로 익히게 합니다.

주제 20개 · 예제 코드 포함 · 최종 수정 2026-08-30 · 작성 pullh 편집팀

다른 언어에서 리스트와 딕셔너리로 갈라지는 두 자료구조를 PHP는 array 하나로 처리합니다. 내부적으로는 삽입 순서를 유지하는 정렬된 해시맵이고, 정수 키가 0부터 빈틈없이 이어질 때만 우리가 아는 배열처럼 보일 뿐입니다. 게다가 배열은 객체와 달리 값 의미론을 가져서 대입하거나 인자로 넘기면 논리적으로 복사됩니다. 실제 복사는 수정이 일어날 때까지 미뤄지므로 성능 걱정은 대개 불필요하고, 대신 함수 안에서 배열을 바꿔도 호출자에게 반영되지 않는다는 점이 중요합니다.

인덱스 배열 만들기연관 배열 만들기로 두 얼굴을 확인한 뒤에는 가공 3종인 array_map 사용, array_filter 사용, array_reduce 합계를 묶어 보십시오. 실무 데이터는 대개 레코드 목록이라 array_column 으로 열 추출이 유용하고, 정렬은 sort 와 rsort 비교로 감을 잡은 뒤 기준이 복잡해지면 usort 사용자 정의 정렬로 넘어가면 됩니다. 마지막의 SplQueue 사용은 배열로 큐를 흉내 낼 때의 재색인 비용을 피하는 대안입니다.

가장 자주 사고가 나는 건 키 보존 규칙입니다. array_filter는 원본 키를 남기므로 중간 원소가 걸러지면 인덱스에 구멍이 생기고, 그 배열은 json_encode에서 배열이 아니라 객체로 직렬화됩니다. API 응답이 {"0":…,"2":…} 로 나오는 원인이 대부분 이것이고, 해법은 array_values() 한 번입니다. array_merge 와 더하기 연산자 차이도 같은 맥락으로, + 는 왼쪽에 이미 있는 키를 덮어쓰지 않지만 array_merge는 정수 키를 새로 매깁니다.

01인덱스 배열 만들기

PHP 배열이 리스트 역할도 할 수 있음을 보여주는 가장 기본 예제입니다.

PHP code

<?php
$langs = ['php', 'python', 'go'];
print_r($langs);
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

02연관 배열 만들기

키와 값으로 데이터를 표현하는 연관 배열의 기본 예제입니다.

PHP code

<?php
$user = ['id' => 1, 'name' => 'mida'];
echo $user['name'];
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

03배열에 값 추가

대괄호 문법과 array_push를 사용해 배열 끝에 값을 추가하는 예제입니다.

PHP code

<?php
$stack = ['php'];
$stack[] = 'laravel';
array_push($stack, 'symfony');

print_r($stack);
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

04array_map 사용

배열 각 요소를 새 값으로 변환하는 array_map 예제입니다.

PHP code

<?php
$numbers = [1, 2, 3];
$squared = array_map(fn (int $n): int => $n * $n, $numbers);

print_r($squared);
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

05array_filter 사용

조건에 맞는 요소만 남기는 array_filter 예제입니다.

PHP code

<?php
$numbers = [1, 2, 3, 4, 5];
$even = array_filter($numbers, fn (int $n): bool => $n % 2 === 0);

print_r($even);
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

06array_reduce 합계

배열 요소를 누적해 하나의 값으로 축약하는 array_reduce 예제입니다.

PHP code

<?php
$numbers = [10, 20, 30];
$sum = array_reduce($numbers, fn (int $carry, int $n): int => $carry + $n, 0);

echo $sum;
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

07array_column 으로 열 추출

복잡한 배열 구조에서 특정 열만 빠르게 추출하는 array_column 예제입니다.

PHP code

<?php
$users = [
    ['id' => 1, 'name' => 'Kim'],
    ['id' => 2, 'name' => 'Lee'],
];

print_r(array_column($users, 'name'));
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

08array_combine 사용

두 배열을 키와 값으로 합쳐 연관 배열을 만드는 예제입니다.

PHP code

<?php
$keys = ['host', 'port'];
$values = ['localhost', 3306];

print_r(array_combine($keys, $values));
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

09array_chunk 로 묶기

긴 목록을 일정 크기의 묶음으로 나누는 array_chunk 예제입니다.

PHP code

<?php
$numbers = range(1, 7);
print_r(array_chunk($numbers, 3));
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

10sort 와 rsort 비교

배열 정렬 함수가 원본 배열을 직접 바꾸는 특성을 확인하는 예제입니다.

PHP code

<?php
$scores = [70, 95, 88];

$asc = $scores;
sort($asc);

$desc = $scores;
rsort($desc);

print_r([$asc, $desc]);
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

sort 계열 함수는 새 배열을 반환하지 않고 원본 배열을 직접 수정합니다.

11usort 사용자 정의 정렬

도메인 규칙에 따라 배열을 정렬하는 usort 예제입니다.

PHP code

<?php
$users = [
    ['name' => 'Kim', 'score' => 90],
    ['name' => 'Lee', 'score' => 98],
];

usort($users, fn (array $a, array $b): int => $b['score'] <=> $a['score']);
print_r($users);
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

12array_unique 중복 제거

중복 값을 제거한 뒤 인덱스를 다시 정리하는 예제입니다.

PHP code

<?php
$tags = ['php', 'api', 'php', 'queue'];
print_r(array_values(array_unique($tags)));
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

13array_flip 키와 값 뒤집기

키와 값을 뒤집어 역방향 조회 테이블을 만드는 예제입니다.

PHP code

<?php
$roles = ['owner' => 'admin', 'member' => 'user'];
print_r(array_flip($roles));
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

14in_array 에 strict 옵션 주기

느슨한 비교를 피하기 위해 in_array의 strict 옵션을 켜는 예제입니다.

PHP code

<?php
$values = [0, '1', 2];
var_dump(in_array(1, $values, true));
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

strict 플래그를 생략하면 문자열 숫자와 정수가 같은 값처럼 비교될 수 있습니다.

15isset 와 array_key_exists 차이

값이 null일 때 isset와 array_key_exists 결과가 달라지는 차이를 보여줍니다.

PHP code

<?php
$data = ['token' => null];

var_dump(isset($data['token']));
var_dump(array_key_exists('token', $data));
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

16다차원 배열 읽기

중첩 배열에서 필요한 값을 단계적으로 읽는 기본 예제입니다.

PHP code

<?php
$config = [
    'db' => ['host' => 'localhost', 'port' => 3306],
];

echo $config['db']['host'];
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

17array_merge 와 더하기 연산자 차이

같은 배열 합치기라도 array_merge와 + 연산자의 우선순위가 다름을 보여줍니다.

PHP code

<?php
$a = ['name' => 'php', 'version' => '8.2'];
$b = ['version' => '8.3', 'type' => 'backend'];

print_r(array_merge($a, $b));
print_r($a + $b);
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

18array_walk 로 제자리 가공

각 행을 제자리에서 후처리하는 array_walk 예제입니다.

PHP code

<?php
$rows = [
    ['name' => 'php'],
    ['name' => 'go'],
];

array_walk($rows, function (array &$row): void {
    $row['slug'] = strtolower($row['name']);
});

print_r($rows);
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

19교집합과 차집합

두 목록에서 겹치는 값과 빠지는 값을 각각 구하는 예제입니다.

PHP code

<?php
$a = ['php', 'go', 'python'];
$b = ['php', 'rust'];

print_r(array_intersect($a, $b));
print_r(array_diff($a, $b));
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

20SplQueue 사용

기본 배열 대신 SPL 자료구조를 활용해 큐를 표현하는 예제입니다.

PHP code

<?php
$queue = new SplQueue();
$queue->enqueue('job-1');
$queue->enqueue('job-2');

echo $queue->dequeue();
알아두면 좋은 점

배열 관련 예제는 키가 유지되는지, 새 배열이 만들어지는지, 원본이 바뀌는지까지 같이 확인하세요.

자주 하는 실수

배열 함수마다 키 유지 여부가 달라서 결과 배열 모양이 달라질 수 있습니다.

정리하며

  • array_filter 결과를 JSON으로 내보내기 전에 array_values로 인덱스를 다시 채웁니다.
  • in_array와 array_search는 세 번째 인자 true 로 엄격 비교를 켭니다.
  • 키 존재 확인은 값이 null일 수 있으면 isset 대신 array_key_exists를 씁니다.
  • 정수 키를 유지하려면 array_merge가 아니라 + 연산자를 선택합니다.

더 깊이 들어가고 싶다면 PHP 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.