목표
아래와 같이 조회 되는 DB 테이블의 데이터를 배열 변수 $row 에 담고,
+--------------+---------------+--------------------+---------+--------+-----------+-----------+
| jo_id_code | jo_it_name | ITEM | HOCHING | PRICE | SALE_RATE | MATCHUM |
+--------------+---------------+--------------------+---------+--------+-----------+-----------+
| MAS23SC06203 | 릴리스(MT) | 누비베개커버 | 50*70 | 10000 | 10 | 불가능 |
| MAS23SC06403 | 릴리스(MT) | 스프레드 | S | 100000 | 10 | 불가능 |
| MAS23SC06403 | 릴리스(MT) | 스프레드 | Q | 400000 | 10 | 불가능 |
| MAS23SC06111 | 릴리스(MT) | 차렵이불 | S | 800000 | 10 | 불가능 |
| MAS23SC06111 | 릴리스(MT) | 차렵이불 | Q | 900000 | 10 | 불가능 |
| MAS23SC04203 | 릴리스(PK) | 누비베개커버 | 50*70 | 30000 | 30 | 불가능 |
| MAS23SC04403 | 릴리스(PK) | 스프레드 | Q | 200000 | 30 | 불가능 |
| MAS23SC04403 | 릴리스(PK) | 스프레드 | S | 300000 | 30 | 불가능 |
| MAS23SC04111 | 릴리스(PK) | 차렵이불 | Q | 600000 | 30 | 불가능 |
| MAS23SC04111 | 릴리스(PK) | 차렵이불 | S | 700000 | 30 | 불가능 |
+--------------+---------------+--------------------+---------+--------+-----------+-----------+
<table> 에 출력하되, 같은 대분류 / 소분류별로 rowspan 하여 셀을 병합.
릴리스(MT) | 누비베개커버 | 50*70 | 10000 | 10 | 불가능 |
스프레드 | S | 100000 | 10 | 불가능 | |
Q | 400000 | 10 | 불가능 | ||
차렵이불 | Q | 800000 | 10 | 불가능 | |
S | 900000 | 10 | 불가능 | ||
릴리스(PK) | 누비베개커버 | 50*70 | 30000 | 30 | 불가능 |
스프레드 | Q | 200000 | 30 | 불가능 | |
S | 300000 | 30 | 불가능 | ||
차렵이불 | S | 600000 | 30 | 불가능 | |
Q | 700000 | 30 | 불가능 |
사용 함수
array_column
배열의 key 를 지정하여, 해당 key 에 해당되는 칼럼만 새로운 배열로 반환한다.
내장 함수가 없는 경우
서버의 PHP 버전이 5.3 이하인 경우 array_column 함수가 없다. 여기에서 다운로드 받아 include 해야 한다.
var_dump( array_column($row, 'jo_it_name') );
// array(10) { [0]=> string(13) "릴리스(MT)" [1]=> string(13) "릴리스(MT)" [2]=> string(13) "릴리스(MT)" [3]=> string(13) "릴리스(MT)" [4]=> string(13) "릴리스(MT)" [5]=> string(13) "릴리스(PK)" [6]=> string(13) "릴리스(PK)" [7]=> string(13) "릴리스(PK)" [8]=> string(13) "릴리스(PK)" [9]=> string(13) "릴리스(PK)" }
array_count_values
배열에 존재하는 값과 개수를 새로운 배열로 반환한다. 2차원 배열이므로 array_column 과 함께 사용.
$arr_name = array_count_values( array_column($row, 'jo_it_name') );
var_dump($arr_name);
// array(2) { ["릴리스(MT)"]=> int(5) ["릴리스(PK)"]=> int(5) }
array_search
첫번째 인자를 배열에서 검색, 해당하는 key 를 반환한다. 여러개 존재 시에도 첫번째 key (순서)만 반환.
$position = array_search('릴리스(MT)', array_column($row, 'jo_it_name'));
echo $position;
// 0
$position = array_search('릴리스(PK)', array_column($row, 'jo_it_name'));
echo $position;
// 5
array_slice
배열의 구간을 지정하여 잘라, 새로운 배열로 반환한다.
$item = array_slice($row, 0, $arr_name['릴리스(MT)']);
var_dump($item);
// array(10) { [0]=> array(7) { ["jo_id_code"]=> string(12) "MAS23SC06203" ["jo_it_name"]=> string(13) "릴리스(MT)" ["ITEM"]=> string(18) ...(생략)...
코드
php
$query = "SELECT * FROM tbl";
$row = selectAll($query); // 쿼리 결과를 배열로 담았음
$k = 0;
$arr_name = array_count_values( array_column($row, 'jo_it_name') );
for ($i = 0; $i < count($row); $i++) {
$this_name = $row[$i]['jo_it_name']; // 이번 패턴 이름
// 이번 패턴이 배열에 존재한다면
if ( array_key_exists($this_name, $arr_name) ) {
$position = array_search($this_name, array_column($row, 'jo_it_name')); // 이번 패턴이 최초로 어디에 위치하는지
$item = array_slice($row, $position, $arr_name[$this_name]); // 이번 패턴만 배열로 추출
for ($j = 0; $j < count($item); $j++) {
if ($j == 0) $item[$j]['rowspan_name'] = count($item); // 이번 패턴만큼 셀 병합
$arr_item = array_count_values( array_column($item, 'ITEM') );
$this_item = $item[$j]['ITEM']; // 이번 아이템 이름
$position = array_search($this_item, array_column($item, 'ITEM')); // 이번 아이템이 최초로 어디에 위치하는지
$item[$position]['rowspan_item'] = $arr_item[$this_item]; // 이번 아이템이 최초로 위치하는 요소에만 이번 아이템 개수만큼 셀 병합
}
$result[$k] = $item;
unset($arr_name[$this_name]); // 이번 패턴을 배열에서 제거
$k++;
}
}
return $result;
html
<table class="table-price">
<tr class="odd">
<th>상품명</th>
<th>구성</th>
<th>사이즈</th>
<th>치수</th>
<th>정가</th>
<th>할인율</th>
<th>할인가</th>
<th>맞춤가능</th>
</tr>
<?
for ($i = 0; $i < count($price); $i++) {
for ($j = 0; $j < count($price[$i]); $j++) {
?>
<tr>
<? if ($price[$i][$j]['rowspan_name']) { ?><td rowspan="<?=$price[$i][$j]['rowspan_name']?>"><?=$price[$i][$j]['jo_it_name']?></td><? } ?>
<? if ($price[$i][$j]['rowspan_item']) { ?><td rowspan="<?=$price[$i][$j]['rowspan_item']?>"><span class="open_item" data-id="<?=$price[$i][$j]['jo_id_code']?>"><?=$price[$i][$j]['ITEM']?></span></td><? } ?>
<td class="tac"><?=$price[$i][$j]['HOCHING']?></td>
<td class="tac"><?=$price[$i][$j]['size']?></td>
<td class="tar"><?=number_format($price[$i][$j]['PRICE'])?></td>
<td class="tac"><?=round($price[$i][$j]['SALE_RATE'])?>%</td>
<td class="tar"><?=number_format($price[$i][$j]['SALE_PRICE'])?></td>
<td class="tac"><?=$price[$i][$j]['MATCHUM']?></td>
</tr>
<? }} ?>
</table>
참고문헌 및 관련링크
'코딩 > PHP' 카테고리의 다른 글
php - 소요시간 계산(초, 분 단위) (0) | 2024.07.09 |
---|---|
스마트 에디터 2 (se2) - 한글 이미지 깨지는 문제 해결 (0) | 2024.06.25 |
PHP - date 함수 인자 정리 (Y-m-d 등) (0) | 2023.01.30 |
자주 쓰는 것들 (1) | 2023.01.19 |
PHP 7.4 - MSSQL 연동 sqlsrv (0) | 2022.12.14 |