[$a, $b] = $array;는 배열의 요소를 한 줄에 개별 변수로 분해합니다. $a는 $array[0]을, $b는 $array[1]을 받습니다. list($a, $b) = $array;는 같은 것의 옛 표기이고, ['name' => $name] = $user;는 키로 같은 일을 합니다.
구조 분해를 explode()와 함께 쓰는 것이 대표적인 용도입니다. 문자열을 나누고, 조각에 이름을 붙이고, 다음으로 넘어갑니다.
요소 건너뛰기
위치를 비워 두면 건너뜁니다. 일찍 멈출 수도 있습니다. 끝에 남는 요소는 무시됩니다.
연관 배열을 키로 구조 분해하기
키를 쓰면 배열 안의 순서는 상관없고 필요한 필드만 가져옵니다. 키는 => 앞에, 변수는 뒤에 씁니다.
리스트에서도 패턴을 같은 방식으로 중첩할 수 있습니다. [[$x1, $y1], [$x2, $y2]] = $line;은 두 점을 한 번에 읽습니다. PHP 7.3부터 패턴 안의 변수가 참조일 수도 있어서([, &$second] = $counts;) $second를 바꾸면 배열이 바뀝니다.
한 대입에서는 위치나 키 중 하나만 쓰며, 둘을 함께 쓸 수 없습니다. [$a, 'k' => $b] = $arr;는 Cannot mix keyed and unkeyed array entries in assignments와 함께 멈춥니다.
두 변수 맞바꾸기
두 값을 반대 순서로 담은 배열을 만들고 다시 구조 분해하세요. 임시 변수가 필요 없습니다.
함수에서 여러 값 반환하기
PHP 함수는 값을 하나 반환하지만, 그 값이 배열일 수 있습니다. 호출하는 쪽에서 구조 분해하면 여러 값을 반환하는 것처럼 읽힙니다. 값이 두세 개보다 많다면 호출하는 쪽이 순서를 헷갈리지 않도록 키와 함께 반환하세요.
foreach 안의 구조 분해
같은 문법이 foreach 줄에서도 동작하므로 각 행이 이미 이름 붙은 변수로 나뉘어 들어옵니다. 사람들이 "list()를 쓰는 foreach"라고 말하는 것이 이것입니다. 더 많은 반복문 패턴은 foreach 페이지에 있습니다.
스프레드 연산자(...)
점 세 개는 배열을 그 자리에서 풀어 놓습니다. 배열 리터럴에서 [...$a, ...$b]는 배열을 합칩니다. 함수 호출에서 f(...$args)는 요소를 별도의 인수로 넘깁니다. 함수 정의에서 ...$args는 남는 인수를 배열로 모읍니다.
PHP 8.1 이전에는 문자열 키가 있는 배열을 펼치면 에러였습니다. 이제는 array_merge()와 같은 규칙으로 문자열 키는 유지되고 숫자 키는 다시 매겨집니다. ...$amounts 같은 가변 매개변수는 다른 매개변수 종류와 함께 함수 페이지에서 다룹니다.
흔한 실수: 변수보다 적은 요소
배열이 패턴보다 짧으면 빠진 변수는 null이 되고 PHP는 각각에 대해 경고를 출력합니다. 필드가 빠진 줄처럼 직접 통제할 수 없는 입력에서 생깁니다. [$name, $city, $country] = explode(',', 'Grace');에 대해 PHP는 다음을 출력합니다.
Warning: Undefined array key 1 in /var/www/html/import.php on line 5
Warning: Undefined array key 2 in /var/www/html/import.php on line 5
빠진 조각이 무엇이어야 할지 정하고, 구조 분해 전에 배열을 채우세요.
키 패턴이라면 먼저 기본값을 합치세요: ['a' => $a, 'b' => $b] = $input + ['a' => null, 'b' => null];. + 연산자는 $input에 아직 없는 키만 추가합니다.
자주 묻는 질문
PHP에서 list()는 무엇을 하나요?
list($a, $b) = $array;는 $array[0]을 $a에, $array[1]을 $b에 대입합니다. PHP 7.1부터 짧은 형태 [$a, $b] = $array;가 정확히 같은 일을 하며, 두 형태 모두 키를 받습니다: ['id' => $id] = $row;.
PHP에서 두 변수를 맞바꾸려면 어떻게 하나요?
두 변수를 반대 순서로 담은 새 배열을 구조 분해하세요: [$a, $b] = [$b, $a];. 임시 변수가 필요 없습니다.
PHP에서 연관 배열에 list()를 쓸 수 있나요?
네, PHP 7.1부터 가능합니다. 키를 지정하세요: ['name' => $name, 'email' => $email] = $user; 또는 list('name' => $name) = $user;. 키가 없으면 [$a, $b] = $user;는 키 0과 1을 찾고 경고와 함께 null을 얻습니다.
PHP에서 점 세 개(...)는 무엇인가요?
스프레드 연산자입니다. 배열 리터럴에서 [...$a, ...$b]는 두 배열의 요소를 새 배열에 복사합니다. 함수 호출에서 max(...$numbers)는 요소를 별도의 인수로 넘깁니다. 함수 정의에서 function sum(...$numbers)는 개수에 상관없이 인수를 배열로 모읍니다.
배열의 요소가 list()의 변수보다 적으면 어떻게 되나요?
남는 변수에는 null이 들어가고, PHP는 Undefined array key 2 같은 경고를 출력합니다. 먼저 배열을 채우세요. 예: [$a, $b, $c] = array_pad($parts, 3, null);.