質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

454閲覧

PHP 配列をtableに出力し、縦方向に重複しているセルを結合したい

osashimy

総合スコア1

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2023/01/24 06:10

前提

以下の回答2を参考に、重複するセルを結合する事は再現できました。
https://teratail.com/questions/99718

PHP

1$data=[ 2 ["年月","月","火","水"], 3 ["H23/1〜H28/3","フットサル","","バスケット"], 4 ["H23/1〜H28/3","フットサル","バトミントン","バスケット"], 5 ["H18/1〜H23/1","フットサル","バトミントン","バレーボール"], 6 ["H18/1〜H23/1","ハンドボール","","バレーボール"], 7]; 8 9/*全てのセルにrowspan=1を設定*/ 10$a=[]; 11foreach($data as $key=>$vals){ 12 $a[$key]=[]; 13 foreach($vals as $val){ 14 $a[$key][]=["value"=>$val,"rowspan"=>1]; 15 } 16} 17// print_r($a); 18 19for($i=count($a)-1;$i>0;$i--){ 20 foreach($a[$i] as $key=>$val){ 21 if($a[$i-1][$key]["value"]==$val["value"]){ 22 $a[$i-1][$key]["rowspan"]=$val["rowspan"]+1; 23 unset($a[$i][$key]); 24 } 25 } 26} 27// print_r($a); 28 29/*上の行のセルのvalueと比較して、同じなら上の業のrowspanを増やし、自分は消す */ 30print "<table border>"; 31foreach($a as $vals){ 32 print "<tr>"; 33 foreach($vals as $val){ 34 $rowspan=$val["rowspan"]>1?" rowspan=".$val["rowspan"]:""; 35 print "<td{$rowspan}>{$val["value"]}</td>"; 36 } 37 print "</tr>"; 38} 39print "</table>";

実現したいこと

この上で、
$key[0]の年月の結合数以上に、$key[1]~[3]を結合しない、とすることは可能でしょうか。
※年月で必ず区切りたいです。

現状だと、
「H23/1〜H28/3」のセルはrowspan=2、
ひとつめの「フットサル」のセルがrowspan=3となり、年月をまたいでしまいます。
ひとつめの「フットサル」のセルをrowspan=2にしたいです。

どうぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

php

1<?php 2 3$data = [ 4 ["年月","月","火","水"], 5 ["H23/1〜H28/3","フットサル","","バスケット"], 6 ["H23/1〜H28/3","フットサル","バトミントン","バスケット"], 7 ["H18/1〜H23/1","フットサル","バトミントン","バレーボール"], 8 ["H18/1〜H23/1","ハンドボール","","バレーボール"], 9]; 10 11function item($value) { 12 return (object)['value' => $value, 'rowspan' => 1]; 13} 14function cell_merge($array, $colIdx) { 15 if (count($array[0]) <= $colIdx) return; 16 17 $len = count($array); 18 for ($i = $len - 1; $i >= 1; --$i) { 19 if ($array[$i - 1][$colIdx]->value === $array[$i][$colIdx]->value) { 20 $array[$i - 1][$colIdx]->rowspan += $array[$i][$colIdx]->rowspan; 21 $array[$i][$colIdx]->rowspan = 0; 22 } 23 } 24 25 for ($i = 0; $i < $len; ++$i) { 26 $rowspan = $array[$i][$colIdx]->rowspan; 27 if ($rowspan >= 2) { 28 cell_merge(array_slice($array, $i, $rowspan), $colIdx + 1); 29 } 30 } 31} 32 33$cells = array_map(function($row) { 34 return array_map(function($value) { 35 return item($value); 36 }, $row); 37}, $data); 38 39cell_merge($cells, 0); 40?> 41<?php 42function esc_attr($str) { if ($str !== null) return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } 43function output($str) { echo esc_attr($str); } 44?> 45<table border="1"> 46 <tbody> 47<?php foreach ($cells as $row) : ?> 48 <tr> 49<?php foreach ($row as $cell) : ?> 50<?php if ($cell->rowspan === 0) continue; ?> 51 <td<?php if ($cell->rowspan >= 2) echo sprintf(' rowspan="%d"', esc_attr($cell->rowspan)); ?>><?php output($cell->value); ?></td> 52<?php endforeach ?> 53 </tr> 54<?php endforeach ?> 55 </tbody> 56</table>

html

1<table border="1"> 2 <tbody> 3 <tr> 4 <td>年月</td> 5 <td></td> 6 <td></td> 7 <td></td> 8 </tr> 9 <tr> 10 <td rowspan="2">H23/1〜H28/3</td> 11 <td rowspan="2">フットサル</td> 12 <td></td> 13 <td>バスケット</td> 14 </tr> 15 <tr> 16 <td>バトミントン</td> 17 <td>バスケット</td> 18 </tr> 19 <tr> 20 <td rowspan="2">H18/1〜H23/1</td> 21 <td>フットサル</td> 22 <td>バトミントン</td> 23 <td>バレーボール</td> 24 </tr> 25 <tr> 26 <td>ハンドボール</td> 27 <td></td> 28 <td>バレーボール</td> 29 </tr> 30 </tbody> 31</table>

投稿2023/01/24 07:48

arcxor

総合スコア2859

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

osashimy

2023/01/25 01:36

ありがとうございました! 思い通りに出力できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問