[PHP] 배열 다시 인덱싱 하기 feat. array_values

예전에 배열에 중복된 값이 있을 경우에 array_unique 라는 함수를 이용해 중복된 값을 제거 할 수 있다고 포스트를 남겨 두었었는데요.

[PHP] 배열의 중복 값 제거하기 feat. array_unique

array_unique 함수를 사용하면서 문제점이 하나 발생했어요.

문제 상황

이런 상황을 가정 해볼께요. 아래처럼 배열에 연도 데이터를 여러개 담아 놓았다고 해봅시다.

$arr = ( 2022, 2022, 2023, 2023, 2024, 2025 );

근데 이 배열이란게 순서가 있다 보니까 원래대로라면 아래와 같이 그 순서도 같이 저장되어 있어요.

$arr = ( 
    [0] => 2022, 
    [1] => 2022, 
    [2] => 2023, 
    [3] => 2023, 
    [4] => 2024, 
    [5] => 2025 
);

이런 상황에서 $arrarray_unique 를 이용해 중복된 값을 제거하면?

$arr = ( 
    [0] => 2022, 
    [2] => 2023, 
    [4] => 2024, 
    [5] => 2025 
);

이렇게 됩니다.. 앞에 순서가 조금 엉망이지만.. 그래도 중복 값 제거는 잘 됩니다.

그런데 한가지 문제가 발생해요. 배열 $arrforeach 에 넣으면 바로 오류 메시지를 뿜어 냅니다. 앞에 순서가 엉망이라서 그런거에요.

해결방법

위 문제의 원인을 해결하는 방법은 아주 간단합니다. 배열에 있는 4개 항목의 순서를 다시 0~3 까지 정의 해주면 돼요. 이때 사용하는 함수가 바로 array_values 입니다.

$arr = array_unique( $arr ); // 중복 값 제거
$arr = array_values( $arr ); // 배열 값 다시 인덱싱 하기

위와 같이 배열을 마사지를 좀 해주면,

$arr = ( 
    [0] => 2022, 
    [1] => 2023, 
    [2] => 2024, 
    [3] => 2025 
);

이렇게 다시 인덱싱 되면서 foreach 문을 사용하는데도 문제가 없어집니다.

array_values

원래 array_values 함수는 keyvalue 로 만들어진 배열에서 값들만 골라네 반환해주는 일을 하는데요.

$arr = array(
    'apple' => 'red',
    'banana' => 'yellow'
);

$arr = array_values( $arr );

// 결과
$arr = array(
    [0] => 'red',
    [1] => 'yellow'
);

위와 같이 key 를 무시하고 value 들로 다시 배열을 만드는 것입니다.

위 예에서 key 는 (망가져버린) 순서이고, 각 연도가 value 니까 그 value 들을 다시 반환해주면 순서가 착착 맞게 배열이 다시 생성되겠죠? 이 기능을 이용해 배열을 마치 다시 인덱싱 한 것과 같은 효과를 내는 것입니다.

array_unique 를 이용하고나서 필요에 따라 array_values 를 적절하게 이용하도록 합시다.

끝.

링크