Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 노션
- getimagesize()
- srtpos()
- 1064
- 배열
- error
- 일부 문자열 포함여부
- myshortcut
- implode()
- MySQL
- 서버부하
- Excel
- 오류
- 정규식
- 동작안함
- 이걸 그렇게 쓸 줄은 몰랐지
- 지직거림
- jQuery
- 중간에추가
- php
- primary_key
- JavaScript
- explode()
- formula
- ES6
- SQL
- strpos()
- 특수문자 포함여부
- includes()
- 문자열 포함여부
Archives
- Today
- Total
코딩짜는 일상
[PHP] 배열 중간에 추가하는 2가지 방법 - array_slice(), array_merge(), foreach() 본문
반응형
서론
배열을 반복문을 이용해 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()
를 이용한 방법이 유리하겠죠.
상황에 따라 맞는 방법을 쓰시면 될 것 같습니다!
반응형
'IT > PHP' 카테고리의 다른 글
[PHP] strpos() 사용시 주의사항! - PHP 버전 7.3 미만인 경우 (0) | 2024.01.23 |
---|---|
[PHP] 문자열에 특수문자 또는 일부 문자열이 포함되어 있는지 확인 - strpos(), preg_match() (0) | 2023.09.13 |
[PHP] 배열을 문자열로 나열(문자열 끝에서 n번째 버리기) - substr(), mb_substr() (0) | 2023.06.15 |
[PHP] mysql_fetch_array와 mysql_fetch_assoc 차이 - print_r 출력 차이 (0) | 2022.05.06 |
[PHP] 문자열, 배열 주고 받기- addslashes(), urlencode(), serialize() (0) | 2022.04.22 |