이 포스트에서는 PHP에서 배열의 특정 원소를 삭제하는 방법을 설명합니다.
PHP에서 배열을 다루다 보면 특정 원소를 삭제해야 할 상황이 발생할 수 있습니다. 이 경우 여러 방법이 있지만, 간단하게 처리할 수 있는 방법은 두 가지입니다. 하나는 unset() 함수를 사용하는 것이고, 다른 하나는 array_splice() 함수를 사용하는 것입니다.
일단, 아래의 코드를 봅시다.
<?php header("Content-Type: text/plain"); $LE_SSERAFIM = array('사쿠라','김채원','허윤진','카즈하','김가람','홍은채',); unset($LE_SSERAFIM[4]); echo implode(', ', $LE_SSERAFIM) . "\n"; $LE_SSERAFIM = array('사쿠라','김채원','허윤진','카즈하','김가람','홍은채',); array_splice($LE_SSERAFIM, 4, 1); echo implode(', ', $LE_SSERAFIM) . "\n"; ?>
이 코드의 실행 결과는 다음과 같습니다.
사쿠라, 김채원, 허윤진, 카즈하, 홍은채 사쿠라, 김채원, 허윤진, 카즈하, 홍은채
둘 다 4번 원소가 제거되었음을 알 수 있습니다. 이렇게 보기에는 둘이 같아 보이지만, 실제로는 차이가 있습니다. 이 코드를 아래처럼 바꿔 보겠습니다.
<?php header("Content-Type: text/plain"); $LE_SSERAFIM = array('사쿠라','김채원','허윤진','카즈하','김가람','홍은채',); unset($LE_SSERAFIM[4]); print_r($LE_SSERAFIM); $LE_SSERAFIM = array('사쿠라','김채원','허윤진','카즈하','김가람','홍은채',); array_splice($LE_SSERAFIM, 4, 1); print_r($LE_SSERAFIM); ?>
이 코드의 실행 결과는 다음과 같습니다.
Array ( [0] => 사쿠라 [1] => 김채원 [2] => 허윤진 [3] => 카즈하 [5] => 홍은채 ) Array ( [0] => 사쿠라 [1] => 김채원 [2] => 허윤진 [3] => 카즈하 [4] => 홍은채 )
차이가 보이십니까? unset() 함수로 삭제했을 경우 삭제한 원소 번호가 결번으로 남지만, array_splice() 함수로 삭제했을 경우 삭제한 원소 번호가 그 뒷번호의 원소로 채워집니다.
이 차이는 배열을 JSON으로 변환시에도 나타나는데, 아래 코드를 봅시다.
<?php header("Content-Type: text/plain"); $LE_SSERAFIM = array('사쿠라','김채원','허윤진','카즈하','김가람','홍은채',); unset($LE_SSERAFIM[4]); echo json_encode($LE_SSERAFIM, JSON_UNESCAPED_UNICODE) . "\n"; $LE_SSERAFIM = array('사쿠라','김채원','허윤진','카즈하','김가람','홍은채',); array_splice($LE_SSERAFIM, 4, 1); echo json_encode($LE_SSERAFIM, JSON_UNESCAPED_UNICODE) . "\n"; ?>
이 코드의 실행 결과는 다음과 같습니다.
{"0":"사쿠라","1":"김채원","2":"허윤진","3":"카즈하","5":"홍은채"} ["사쿠라","김채원","허윤진","카즈하","홍은채"]
json_encode() 함수를 이용하여 배열을 JSON으로 변환할 때 배열 키가 0번부터 순서대로 있으면 JSON_FORCE_OBJECT 인자를 주지 않는 이상 일반 배열로 보고 변환하지만, 그렇지 않고 다음 조건 중 하나에 걸리게 되면 객체로 보고 변환합니다.
- 숫자가 아닌 배열 키가 존재할 경우 (예: ‘name’)
- 배열 순서가 중간에 뒤틀린 경우 (예: 0, 1, 3, 2)
- 배열 키 중에 빠진 숫자가 존재할 경우 (예: 0, 1, 2, 4)
- 배열 키 숫자가 0이 아닌 숫자부터 시작할 경우 (예: 1, 2, 3, 4)
unset() 함수로 배열을 삭제하여 중간에 빠진 번호를 만들게 되면 조건 C에 걸리게 되고 그로 인해 JSON 변환시 일반 배열이 아닌 객체로 변환되는 결과가 나옵니다.