코딩짜는 일상

[PHP] 배열 중간에 추가하는 2가지 방법 - array_slice(), array_merge(), foreach() 본문

IT/PHP

[PHP] 배열 중간에 추가하는 2가지 방법 - array_slice(), array_merge(), foreach()

Remily 2023. 7. 6. 13:01
반응형

서론

배열을 반복문을 이용해 select box로 만드는 기능을 만들어 쓰는데

버전에 따라 특정 옵션이 추가되거나 제외되어야 하는 상황이었습니다.

 

그냥 배열을 2개 만들기엔 기존 배열A가 중복되는 것이 걸리고

추가되거나 제외될 배열B와는 따로 관리되어야

추후 수정이 용이할 것 같았습니다.

 

 

그래서 버전에 따라 select box 생성 함수를 따로 만들고

배열B에서 추출한 일부 값을 배열A 중간에 삽입해야 했습니다.

 

 

 


1번 array_slice() & array_merge()

삽입할 위치를 찾아 배열A를 둘로 자르고array_slice()

 

원하는 데이터를 배열B에서 추출해 붙인 뒤

값을 추가할 경우: 배열A앞부분[] = 배열B추출;

배열을 추가할 경우: 배열A앞부분 += 배열B추출;

 

남은 배열을 뒤에 덧붙여주는 방법입니다. array_merge()

// 배열 예시
$option_default = array(    // 일반옵션
    array('카테고리' => '기본', '옵션명' => '핫', '가격' => 0),
    array('카테고리' => '기본', '옵션명' => '아이스', '가격' => 0),
    array('카테고리' => '시럽', '옵션명' => '시럽추가', '가격' => 200),
    array('카테고리' => '베이스', '옵션명' => '소잘우유변경', '가격' => 600),
    array('카테고리' => '디저트', '옵션명' => '아메리칸쿠키추가', '가격' => 1000),
    );
$option_diet = array(       // 다이어트용 옵션
    array('카테고리' => '시럽', '옵션명' => '라이트시럽추가', '가격' => 400),
    );

// 설명 : 일반옵션의 '시럽추가' 다음에 '라이트시럽추가' 옵션을 넣어야 함. 해당내용을 함수로 만들어 번거로움을 줄임.
function addDietoption($baseArr, $idx, $addArr){
    $arr_front = array_slice($baseArr, 0, $idx);    // 인덱스 0번부터 $idx까지 자르기
    $arr_back = array_slice($baseArr, $idx);        // 인덱스 $idx부터 끝까지 자르기

    $arr_front[] = $addArr;                            // 값 추가.

    return array_merge($arr_front, $arr_back);        // 배열 합치기
}

// 반복문으로 카테고리가 시럽에서 베이스로 바뀔 때 다이어트용 옵션을 끼워넣기
$chk = $option_default[0]['카테고리'];
$resultArr = $option_default;
foreach($option_default as $key => $val){
    if($chk != $val['카테고리']){
        foreach($option_diet as $k => $v){
            if($chk == $v['카테고리']){
                // 일반옵션의 카테고리와 다이어트옵션의 카테고리가 같을 때(시럽일 때) 배열을 자르고 붙이기
                $resultArr = addDietoption($resultArr, $key, $v);
            }
        }
    }
    $chk = $val['카테고리'];
}
print_r($resultArr);

 

 

하지만 이 방법에는 문제점이 하나 있습니다.

 

끼워넣기가 한 번이라면 모를까, 여러번이라면 순서가 밀리기 때문이죠.

시험 삼아 $option_diet에 배열 몇 개를 추가하시면 이해하실 수 있을 겁니다.

 

 

 


2번 foreach()를 이용

그래서 위 문제점을 보완한 방법이

반복문을 이용해 조건이 맞을 때마다 옵션을 추가해 넣는 방식입니다.

// 배열 예시
$option_default = array(    // 일반옵션
    array('카테고리' => '기본', '옵션명' => '핫', '가격' => 0),
    array('카테고리' => '기본', '옵션명' => '아이스', '가격' => 0),
    array('카테고리' => '시럽', '옵션명' => '시럽추가', '가격' => 200),
    array('카테고리' => '베이스', '옵션명' => '소잘우유변경', '가격' => 600),
    array('카테고리' => '디저트', '옵션명' => '아메리칸쿠키추가', '가격' => 1000),
    );
$option_diet = array(       // 다이어트용 옵션
    array('카테고리' => '시럽', '옵션명' => '라이트시럽추가', '가격' => 400),
    array('카테고리' => '시럽', '옵션명' => '라이트바닐라시럽추가', '가격' => 700),
    array('카테고리' => '베이스', '옵션명' => '아몬드우유변경', '가격' => 500),
    );

// 설명 : 반복문으로 카테고리가 바뀔 때마다 이전 카테고리에 해당하는 다이어트용 옵션을 끼워넣기
$chk = $option_default[0]['카테고리'];
$resultArr = array();
foreach($option_default as $key => $val){
    if($chk != $val['카테고리']){
        foreach($option_diet as $k => $v){
            if($chk == $v['카테고리']){    // 일반옵션의 카테고리와 다이어트옵션의 카테고리가 같을 때 배열추가
                $resultArr[] = $v;
            }
        }
    }
    $resultArr[] = $val;
    $chk = $val['카테고리'];
}
print_r($resultArr);

 

 

 


결론

1번과 2번 방식은 각각 장단점이 있습니다.

 

원본 배열이 매우 크고 한 번만 추가하는 상황이라면

array_slice() & array_merge()가 유리할 것이고

 

원본 배열에 여러번 추가하는 상황이라면

foreach()를 이용한 방법이 유리하겠죠.

 

 

상황에 따라 맞는 방법을 쓰시면 될 것 같습니다!

반응형