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

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

新規登録して質問してみよう
ただいま回答率
85.35%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

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

Q&A

解決済

1回答

3089閲覧

多次元配列をループさせてtableに表示させたい

yoto009

総合スコア9

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

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

0グッド

0クリップ

投稿2020/10/03 09:29

編集2020/10/03 09:40

前提・実現したいこと

お世話になっております。
phpで生成した多次元配列をrowspanを使ったtableタグへ出力する際にうまく表示できず困っております。

自分なりに色々試したのですが理想の形になりませんでした。原因はループした際のtrタグがおかしくif等で条件で挿入していくべきとは思うのですがどのように処理するべきか詰まってしまったのでお手数ですがアドアバイスをいただけますと幸いです。よろしくお願いいたします!

現在ののtable↓
イメージ説明

実現したいtable↓
イメージ説明

該当のソースコード

php

1$user_array = [ 2 1 => [ 3 1 => [ 4 'name' => 'ユーザー1', 5 'email' => 'example@example.com', 6 'age' => 17, 7 ], 8 2 => [ 9 'name' => 'ユーザー2', 10 'email' => 'example@example.com', 11 'age' => 18, 12 ], 13 3 => [ 14 'name' => 'ユーザー3', 15 'email' => 'example@example.com', 16 'age' => 17, 17 ], 18 4 => [ 19 'name' => 'ユーザー4', 20 'email' => 'example@example.com', 21 'age' => 16, 22 ], 23 ], 24 2 => [ 25 5 => [ 26 'name' => 'ユーザー5', 27 'email' => 'example@example.com', 28 'age' => 14, 29 ], 30 6 => [ 31 'name' => 'ユーザー6', 32 'email' => 'example@example.com', 33 'age' => 15, 34 ], 35 7 => [ 36 'name' => 'ユーザー7', 37 'email' => 'example@example.com', 38 'age' => 14, 39 ], 40 8 => [ 41 'name' => 'ユーザー8', 42 'email' => 'example@example.com', 43 'age' => 12, 44 ], 45 ] 46]; 47 48$count = 4;

php

1<table> 2 <thead> 3 <tr> 4 <th>グループID</th> 5 <th>ユーザーID</th> 6 <th>ユーザー名</th> 7 <th>メールアドレス</th> 8 <th>年齢</th> 9 <th>編集</th> 10 <th>削除</th> 11 </tr> 12 </thead> 13 <tbody> 14 <?php $i = 1; ?> 15 <?php foreach ($user_array as $user_group_id => $user_data): ?> 16 <tr> 17 <td rowspan="<?= $count; ?>"><?= $user_group_id; ?></td> 18 <?php foreach ($user_data as $user_id => $data): ?> 19 <td><?= $user_id ?></td> 20 <td><?= $data['name']; ?></td> 21 <td><?= $data['email']; ?></td> 22 <td><?= $data['age']; ?></td> 23 <td><?= $data['favorite']; ?></td> 24 <?php endforeach; ?> 25 <td rowspan="<?= $count; ?>"><a href="edit.php">編集</a></td> 26 <td rowspan="<?= $count; ?>"><a href="delete.php">削除</a></td> 27 </tr> 28 <?php if ($i > 1): ?> 29 <tr> 30 <?php foreach ($user_data as $user_id => $data ): ?> 31 <td><?= $user_id ?></td> 32 <td><?= $data['name']; ?></td> 33 <td><?= $data['email']; ?></td> 34 <td><?= $data['age']; ?></td> 35 <td><?= $data['favorite']; ?></td> 36 <?php endforeach; ?> 37 </tr> 38 <?php endif; ?> 39 <?php $i++ ?> 40 <?php endforeach; ?> 41 </tbody> 42</table> 43

補足情報(FW/ツールのバージョンなど)

PHP 5.6

追記

実現したいtableのモックのソース

html

1<table> 2 <thead> 3 <tr> 4 <th>ユーザーグループID</th> 5 <th>ユーザーID</th> 6 <th>ユーザー名</th> 7 <th>メールアドレス</th> 8 <th>年齢</th> 9 <th>編集</th> 10 <th>削除</th> 11 </tr> 12 </thead> 13 <tbody> 14 <tr> 15 <td rowspan="4">1</td> 16 <td>1</td> 17 <td>ユーザー1</td> 18 <td>example1@example.com</td> 19 <td>17</td> 20 <td rowspan="4"><a href="edit.php">編集</a></td> 21 <td rowspan="4"><a href="delete.php">削除</a></td> 22 </tr> 23 <tr> 24 <td>2</td> 25 <td>ユーザー2</td> 26 <td>example1@example.com</td> 27 <td>18</td> 28 </tr> 29 <tr> 30 <td>3</td> 31 <td>ユーザー3</td> 32 <td>example1@example.com</td> 33 <td>17</td> 34 </tr> 35 <tr> 36 <td>4</td> 37 <td>ユーザー4</td> 38 <td>example1@example.com</td> 39 <td>16</td> 40 </tr> 41 <tr> 42 <td rowspan="4">2</td> 43 <td>5</td> 44 <td>ユーザー5</td> 45 <td>example2@example.com</td> 46 <td>14</td> 47 <td rowspan="4"><a href="edit.php">編集</a></td> 48 <td rowspan="4"><a href="delete.php">削除</a></td> 49 </tr> 50 <tr> 51 <td>6</td> 52 <td>ユーザー6</td> 53 <td>example1@example.com</td> 54 <td>15</td> 55 </tr> 56 <tr> 57 <td>7</td> 58 <td>ユーザー7</td> 59 <td>example1@example.com</td> 60 <td>14</td> 61 </tr> 62 <tr> 63 <td>8</td> 64 <td>ユーザー8</td> 65 <td>example1@example.com</td> 66 <td>13</td> 67 </tr> 68 </tbody> 69</table>

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

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

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

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

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

m.ts10806

2020/10/03 09:36

「実現したいtable」をモックでは作れていますか?
yoto009

2020/10/03 09:40

はい、できております。 追記に該当のソースを追記しました!
guest

回答1

0

ベストアンサー

カウンタを使ってやると良いと思います。
下記、イメージで。

php

1 2 <?php 3 foreach($user_array as $gid=>$udatalist){ 4 $rcnt = 0; 5 $gucount = count($udatalist); 6 foreach($udatalist as $uid=>$udata){ 7 echo '<tr>'.PHP_EOL; 8 $rsp = ($rcnt===0)?' rowspan="'.$gucount.'"':''; 9 if($rcnt===0){ 10 echo '<td'.$rsp.'>'.$gid.'</td>'.PHP_EOL; 11 } 12 echo '<td>'.$uid.'</td>'.PHP_EOL; 13 if($rcnt === 0){ 14 echo '<td'.$rsp.'><a>編集</a></td>'.PHP_EOL; 15 echo '<td'.$rsp.'><a>削除</a></td>'.PHP_EOL; 16 } 17 echo '</tr>'.PHP_EOL; 18 $rcnt++; 19 } 20 } 21 ?>

法則を考えると良いです。
0. すべてのユーザーはtrで囲う
0. グループの最初だけrowspanのtdが出る
0. rowspanの数はグループに所属するユーザー数

投稿2020/10/03 10:41

編集2020/10/03 10:46
m.ts10806

総合スコア80875

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

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

yoto009

2020/10/03 13:42

ご回答ありがとうございます!おかげさまで理想のtableにすることができました! 法則がイメージできても中々コードに落とし込めなかったりとまだまだ勉強不足ですね。 こんな書き方もあるのかと、とても参考になりました。
m.ts10806

2020/10/03 13:46

そのためにモックを作ります。 私もモックを提示されて初めて考えてコードにしました。 あまりview内に直接PHP書くことがなくなってきてるので、そういうサンプルも手元にはありません。 何度か回答とコードを調整しているので、どう組んでいったか過程や葛藤が編集履歴から伺えると思います。
yoto009

2020/10/03 14:03

確かに漠然とコードを書いていてもこんがらがってしまいますね。 モックでイメージを固めてどうなるのが理想なのかを明確にするべきでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問