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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

Q&A

3回答

694閲覧

PHP foreach でtableを描く際に被った項目をまとめる

masanobii

総合スコア11

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

0グッド

1クリップ

投稿2022/06/05 00:42

編集2022/06/05 08:40

PHPのforeachでtableを描く時、縦列で被った項目をrowspanのようにまとめる方法を教えてください。

やりたいこと
・foreachでDBからデータを持ってきて順次表示する
・A列で被った項目はまとめて表示(以下図イメージ)

やりたいイメージ図
イメージ説明

PHP

1 <table> 2 <tr> 3 <th>A</th> 4 <th>B</th> 5 <th>C</th> 6 </tr> 7 8 <?php foreach ($nums as $num) : ?> 9 <tr> 10 <td><?php echo $num->getA(); ?></td> 11 <td><a href="<?php echo $num->getUrl(); ?>"><?php echo $num->getB(); ?></a></td> 12 <td><?php echo $num->getC(); ?></td> 13 </tr> 14 <?php endforeach; ?> 15 </table>

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

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

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

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

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

guest

回答3

0

先日同様の質問があったので以下回答してあります。

投稿2022/06/06 00:59

yambejp

総合スコア114883

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

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

0

こんな感じでしょうか。

php

1<?php 2$data = [ 3 ['A' => 'red', 'B' => 1], 4 ['A' => 'red', 'B' => 2], 5 ['A' => 'green', 'B' => 3], 6 ['A' => 'green', 'B' => 4], 7 ['A' => 'green', 'B' => 5], 8 ['A' => 'blue', 'B' => 6], 9 ['A' => 'blue', 'B' => 7], 10 ['A' => 'black', 'B' => 8], 11 ['A' => 'red', 'B' => 9], 12]; 13 14function groupSort($array) { 15 $groups = []; 16 foreach ($array as $record) $groups[$record['A']][] = $record; 17 18 $result = []; 19 foreach ($groups as $group) { 20 foreach ($group as $idx => $record) { 21 $record['_span'] = $idx === 0 ? count($group) : 0; 22 $result[] = $record; 23 } 24 } 25 return $result; 26} 27 28$spannedData = groupSort($data); 29function output($str) { echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } 30?> 31<table> 32 <thead> 33 <tr> 34 <th>A</th> 35 <th>B</th> 36 </tr> 37 </thead> 38 <tbody> 39<?php foreach ($spannedData as $record) : ?> 40 <tr> 41<?php if ($record['_span'] > 0) : ?> 42 <td rowspan="<?php output($record['_span']) ?>"><?php output($record['A']); ?></td> 43<?php endif; ?> 44 <td><?php output($record['B']); ?></td> 45 </tr> 46<?php endforeach; ?> 47 </tbody> 48</table>

html

1<table> 2 <thead> 3 <tr> 4 <th>A</th> 5 <th>B</th> 6 </tr> 7 </thead> 8 <tbody> 9 <tr> 10 <td rowspan="3">red</td> 11 <td>1</td> 12 </tr> 13 <tr> 14 <td>2</td> 15 </tr> 16 <tr> 17 <td>9</td> 18 </tr> 19 <tr> 20 <td rowspan="3">green</td> 21 <td>3</td> 22 </tr> 23 <tr> 24 <td>4</td> 25 </tr> 26 <tr> 27 <td>5</td> 28 </tr> 29 <tr> 30 <td rowspan="2">blue</td> 31 <td>6</td> 32 </tr> 33 <tr> 34 <td>7</td> 35 </tr> 36 <tr> 37 <td rowspan="1">black</td> 38 <td>8</td> 39 </tr> 40 </tbody> 41</table>

投稿2022/06/05 14:10

arcxor

総合スコア2859

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

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

0

JavaScriptを用いて無理やり要素を挿入すれば動くのでしょうが、table要素の決まり的にPHPのみで質問者様が求めている動作を実現するのは難しいのではと思います。

私的にはdiv要素などを用い、flexboxで実現するやり方が一番簡単なのではと思いました...!

投稿2022/06/05 02:10

raratyurara

総合スコア45

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

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

masanobii

2022/06/05 03:17

ご返答ありがとうございます。 PHPのみでは難しいのですね。。。 追加でのご質問となり恐縮なのですが、flexboxを使って上記行う場合にはどのようなコードになるのか教えていただけないでしょうか。 よろしくお願いいたします。
raratyurara

2022/06/05 03:42 編集

ありがとうございます! また、よくよく考えてみたところ、連想配列でキーを指定してあげて以下のようにすればPHPのみで実現できるように考えたのですがこちらでいかがでしょうか?(動作未確認ですのでご了承いただければ幸いです。) 大変お手数おかけしました... <?php foreach ($nums as $key => $num) : ?> <tr> <?php if ($key === 0): ?> <td rowspan="5"><?php echo $num->getA(); ?></td> <?php endif; ?> <td><a href="<?php echo $num->getUrl(); ?>"><?php echo $num->getB(); ?></a></td> <?php if ($key === 0): ?> <td rowspan="5"><?php echo $num->getC(); ?></td> <?php endif; ?> </tr> <?php endforeach; ?> また、念のためflexで指定したcodepenも共有しておきます!(かなり簡単なものです。) 期待する動作と異なっていましたら申し訳ありません... https://codepen.io/raratyurara/pen/rNJrMYy
raratyurara

2022/06/05 03:45

たびたびすみません! 上記はforeachでループする回数分 if(~~~) を実行しているため、膨大なデータを扱う際はパフォーマンスが落ちるケースがございますのでご注意ください!
masanobii

2022/06/05 04:05

ご返答ありがとうございます。 rowspan="" を可変させる場合はどのようにすべきでしょうか。 上記の「やりたいイメージ図」は、イメージ図でして、DBから取り出す値に応じて、縦列の同じ項目を統一する(rowspan)がその都度変わることをしたいと考えております。 tableの行数はDBのデータ数に応じて変動します。 何度もご質問をさせていただき申し訳ございませんが教えていただけないでしょうか。 別途flexに関しても動作させてみます。
raratyurara

2022/06/05 04:11

- rowspan="" を可変させる場合はどのようにすべきでしょうか。 PHPのcount関数を使用して$numsの個数に合わせるやり方はいかがでしょうか?
masanobii

2022/06/05 06:28

ありがとうございます。 ご提案の通り、count関数でできそうな気がして検討してみたものの狙いとする表記にすることができません。 簡単でも構いませんので、コードのイメージを教えていただけないでしょうか。 いくつものご質問すいません。
raratyurara

2022/06/05 07:21

ありがとうございます! <td rowspan="<?php echo count($nums) ?>"><?php echo $num->getA(); ?></td> のようなイメージであったのですが、いかがでしょうか? また、上記が実装できなさそうであれば、やむなしですがrowspanに100や999など超えることがあり得なさそうな数値をセットすれば一応動くはずです。(こちら私的にはおすすめしません...)
masanobii

2022/06/05 08:35

raratyuraraさん 何度もすいません。 私の質問が悪く、やりたいことの誤解を招いている可能性がありすいません。 やりたいイメージ図を変更いたしました。(0列の値は同一項目があればその都度結合するイメージです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問