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

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

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

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

Q&A

解決済

1回答

2892閲覧

【php】CSVから表リスト描画

DaisukeMori

総合スコア225

PHP

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

0グッド

1クリップ

投稿2018/06/08 08:19

編集2018/06/09 07:57

前提条件(追加)

あくまで外部のCSVファイルを読み込んで要件を実現させる
※php上でのデータ入力はなし

php

1// このコードを必ず使う 2$file = fopen('shop_list.csv', 'r');

実現したい事

現在手作業で配列(配列自体はExcel上で自動作成)に情報を入れて、表リストを生成しているのですが、
今後はフォーム上でCSVをアップロードして、手作業時の描画と全く同じことを実現したい。

問題点・分からないこと

CSVから自動生成することは可能になったが、
完成型(参照画像下部)のように同じエリア名を束ねる事ができていない

参照画像
イメージ説明

shop_list.csv エリア1,ランチ ○○店1,ランチ 神戸店1住所 エリア1,ランチ ○○店2,ランチ 神戸店2住所 エリア2,スイーツ ○○店1,スイーツ ○○店1住所 エリア2,スイーツ ○○店2,スイーツ ○○店2住所

html

1<!-- 参照画像上部 --> 2 <table> 3 <tr> 4 <td class="city"></td> 5 <td class="shopName">店舗名</td> 6 <td class="address">住所</td> 7 </tr> 8 <?php $file = fopen('shop_list.csv', 'r'); ?> 9 <?php if($file !== FALSE ): ?> 10 <?php while( ($data = fgetcsv($file)) !== FALSE ): ?> 11 <?php 12 $area = $data[0]; 13 $shop = $data[1]; 14 $address = $data[2]; 15 ?> 16 <tr> 17 <td class="city" ><?=$area ?></td> 18 <td><?=$shop ?></td> 19 <td><?=$address ?></td> 20 </tr> 21 <?php endwhile; ?> 22 <?php endif; ?> 23 <?php fclose ( $file ); ?> 24 </table>

html

1<!-- 2参照画像下部 3現在、手作業でリスト生成しているコード 4--> 5<?php 6 $sales_list = array( 7 'エリア1' => array( 8 array('name' => '店舗名', 'address' => '住所'), 9 array('name' => '店舗名', 'address' => '住所'), 10 ), 11 'エリア2' => array( 12 array('name' => '店舗名', 'address' => '住所'), 13 array('name' => '店舗名', 'address' => '住所'), 14 ), 15 ); 16 ?> 17 <table> 18 <tr> 19 <td class="city"></td> 20 <td class="shopName">店舗名</td> 21 <td class="address">住所</td> 22 </tr> 23 <?php 24 foreach ($sales_list as $area => $shops) : 25 $count = 1; 26 foreach ($shops as $shop) : 27 echo '<tr>'; 28 if ($count++ === 1) { 29 echo '<td class="city" rowspan="'.count($shops).'">'.$area.'</td>'; 30 } 31 echo '<td>'.$shop['name'].'</td>'; 32 echo '<td>'.$shop['address'].'</td>'; 33 echo '</tr>'; 34 endforeach; 35 endforeach; 36 ?> 37 </table>

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

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

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

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

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

guest

回答1

0

ベストアンサー

td要素を縦につなげるには、ご存知のようにrowspan属性をもたせる必要があり、
1行読み込んでは1行出力するという単純な処理では実現できません。

各セルのデータを一時的に積み上げておく(配列に記憶するなど)、
各セルの最左列データが前行と確実に変化するのを確認してから出力処理をする、
前行と同じデータのセルはtd要素を出力しない、
などのやり方が無難かと思われます。

そんなわけで、サンプルコードを書いてみた。

php

1<?php 2 3function output_table($stack_arr) { 4 for ($i = 0; $i < count($stack_arr); $i++) { 5 if ($i == 0) { 6?> 7 <tr> 8 <td colspan="<?php echo count($stack_arr); ?>"><?php echo $stack_arr[$i][0]; ?></td> 9 <td><?php echo $stack_arr[$i][1]; ?></td> 10 <td><?php echo $stack_arr[$i][2]; ?></td> 11 </tr> 12<?php 13 } 14 else { 15?> 16 <tr> 17 <td><?php echo $stack_arr[$i][1]; ?></td> 18 <td><?php echo $stack_arr[$i][2]; ?></td> 19 </tr> 20<?php 21 } 22 } 23 24} 25 26$csv_text =<<< EOT 27エリア1,ランチ ○○店1,ランチ 神戸店1住所 28エリア1,ランチ ○○店2,ランチ 神戸店2住所 29エリア2,スイーツ ○○店1,スイーツ ○○店1住所 30エリア2,スイーツ ○○店2,スイーツ ○○店2住所 31EOT; 32$csv_arr = array_map(function ($val) { 33 return explode(',', $val); 34}, explode(PHP_EOL, $csv_text)); 35?> 36<table border="1"> 37 <tr> 38 <th><br /></th> 39 <th>店舗名</th> 40 <th>住所</th> 41 </tr> 42<?php 43$stack_arr = []; 44foreach ($csv_arr as $arr) { 45 if (count($stack_arr) == 0) { 46 $stack_arr[] = $arr; 47 } 48 else { 49 if ($stack_arr[count($stack_arr)-1][0] === $arr[0]) { 50 $stack_arr[] = $arr; 51 } 52 else { 53 output_table($stack_arr); 54 $stack_arr = []; 55 $stack_arr[] = $arr; 56 } 57 } 58} 59output_table($stack_arr); 60?> 61</table>

実行結果
イメージ説明

投稿2018/06/08 09:15

編集2018/06/08 09:17
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

DaisukeMori

2018/06/08 10:01

ご回答ありがとうございます。 一度、試してみます。
DaisukeMori

2018/06/09 07:27

確かにこのコードを動かせば、 見た目上はrowspanで結合されました。 ただ、以下のデータをコード上に直接記入するのでは csvファイルをフォームからアップロードして 表リストを生成する要件が失われてしまいました。 前提を追加するようで大変申し訳ないですが、 「$file = fopen('shop_list.csv', 'r');」を利用して 要件を達成するにはどこを変更すればよろしいでしょうか? (アップしていただいた部分抜粋) $csv_text =<<< EOT エリア1,ランチ ○○店1,ランチ 神戸店1住所 エリア1,ランチ ○○店2,ランチ 神戸店2住所 エリア2,スイーツ ○○店1,スイーツ ○○店1住所 エリア2,スイーツ ○○店2,スイーツ ○○店2住所 EOT; $csv_arr = array_map(function ($val) { return explode(',', $val); }, explode(PHP_EOL, $csv_text));
DaisukeMori

2018/06/09 13:05

まずこの度はコードの作成ありがとうございました。 $csv_textのところにどうしても外部のCSVを読み込んだデータがアップできなかったため、ひとまず、編集フォームを設けて、フォームからデータベースへ格納。データベースからこの変数に入れることができれば、一応Webブラウザ上(コードをいじらずに)から編集できるので、この方向で製作を進めていこうと思いました。 この要件に関しては、おいおい、CSVファイルを直接アップして、編集できるように随時研究していきたいと思います。また、この要件が達成でき次第、どうやって達成できたか、共有したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問