본문으로 바로가기

PHP - 같은 항목 테이블 셀 병합 (rowspan)

category 코딩/PHP 2023. 6. 23. 16:22

 

목표

아래와 같이 조회 되는 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 - date 함수 인자 정리 (Y-m-d 등)  (0) 2023.01.30
자주 쓰는 것들  (1) 2023.01.19
PHP 7.4 - MSSQL 연동 sqlsrv  (0) 2022.12.14
[PHP] 초성/자음 추출 함수  (1) 2022.10.04
VScode Extension - PHP IntelliSense 설정  (1) 2022.09.22