106호. PHP 배열 해체 단축 문법 free

2020-01-02


배열 해체(Array Destructuring), 많이 사용하시나요? PHP 7.1에 새로운 배열 해체 문법이 추가되었었다고 하는데 저는 왜 이제야 알았을까요? ㅠ 혹시 저 같은 분들이 또 계실지 몰라서 소개합니다.


PHP 7.1에 PHP 4 시절부터 존재하던 list()의 단축 문법이 추가되었습니다.


<?php
$data = [
[1, 'Tom'],
[2, 'Fred'],
];

// list() style
list($id1, $name1) = $data[0];

// [] style
[$id1, $name1] = $data[0];

// list() style
foreach ($data as list($id, $name)) {
// logic here with $id and $name
}

// [] style
foreach ($data as [$id, $name]) {
// logic here with $id and $name
}

array() 대신 []를 쓰는 것과 같다고 보시면 됩니다. 저는 요즘 코드를 보다가 array()가 등장하면 '오래된 코드구나' 혹은 '새 것을 받아들이는 속도가 늦는 분이 작성한 코드구나'라고 생각하는데요. list()를 쓰는 제 코드를 보고 다른 분들도 저를 그리 생각했을것 같아 얼굴이 화끈거리네요. @.@


꼭 새로운 걸 써야하느냐! 라고 반문하시는 분이 계실 수도 있을거 같아요. 물론 그런건 아닙니다. 저는 array()나 list()보다 []가 타자수도 적고 읽기도 편한데 안 쓸 이유가 없다고 생각합니다만, 어차피 기능은 같으니 취향껏 골라쓰면 됩니다. :)


일부만 가져다 쓰기


사용하지 않을 변수는 만들 필요가 없겠죠. 아래와 같이 하면 첫 번째 요소는 건너띄고 두 번째, 세 번째 요소만 가져올 수 있습니다.


[, $b, $c] = $array;

단, 주의할 점은 무조건 0번 인덱스부터 시작되기 때문에 다음과 같은 배열에서는 기대했던대로 동작하지 않을 수 있습니다.


$array = [
1 => 'a',
2 => 'b',
3 => 'c'
]

[, $b, $c] = $array;

// 결과
// $b = a
// $c = b

숫자가 아닌 인덱스


PHP 7.1부터 배열을 해체할 때 숫자가 아닌 인덱스도 사용할 수 있게 되었습니다.


$array = [
'a' => 1,
'b' => 2,
'c' => 3,
];

['c' => $c, 'a' => $a] = $array;

// 결과
// $c = 3
// $a = 1

당연히 활용 폭이 훨씬 넓어졌습니다. 아래는 foreach 구문에서 활용하는 예제입니다.


$array = [
[
'name' => 'a',
'id' => 1
],
[
'name' => 'b',
'id' => 2
],
];

foreach ($array as ['id' => $id, 'name' => $name]) {
// …
}

마치며


마지막 예제의 경우 list() 단축 문법을 몰랐다면 살짝 당황스러운 코드였을 것 같습니다. 나는 쓰지 않더라도 다른 사람은 사용할 수 있기 때문에 새로운 문법은 빨리 빨리 익혀두는게 좋은 것 같아요.


그럼 오늘도 즐거운 하루 되세요!


1일 1식 라라벨 106호

2020년 1월 2일


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.