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

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

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

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

Q&A

解決済

2回答

296閲覧

PHP CSVから読み込んだデータを任意の場所に出力したい。

noriBanana

総合スコア12

PHP

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

0グッド

0クリップ

投稿2018/08/21 05:13

編集2018/08/21 05:36

CSVを読み込んで出力することには成功しました。
色々試してみましたが任意の場所に出力できず悩んでいます。何卒ご教授いただければと存じます。

php

<?php $lines = file('csv/sample.csv'); foreach($lines as $line){ $data = explode(",",$line); echo '<table>'; if(empty($data[1])){ echo '<thead><tr><th colspan="2">'.$data[0].'</th><th colspan="2">'.$data[2].'</th></tr></thead>'; }else{ echo '<tbody>'; foreach($lines as $line){ if($uni%2==0){ echo '<tr><th>'.$data[1].'</th><td>'.$data[2].'</td>'; }else{ echo '<th>'.$data[1].'</th><td>'.$data[2].'</td></tr>'; } $uni+=1; } } echo '</tbody></table>'; } ?>

大カテゴリ(弁当名)の中に中カテゴリ(各おかず)があるイメージです。

if(empty($data[1]))

で、データ[1]に値がないときは大カテゴリ名を表示、値があるときは中カテゴリ名を表示させています。

foreachの中でforeachを使って見ましたが、すべてのデータが出力されてしまい、うまく行きません。(コードを見れば当たり前ですが・・)
どうすればよいのか分かりません。
お忙しいところ恐れ入りますが、お知恵を拝借できればと存じます。

読み込んでるCSV

幕内弁当,,400kcal 幕内弁当,焼き鮭,120kcal 幕内弁当,ごはん,220kcal 幕内弁当,ひじき,40kcal 焼肉弁当,,920kcal 焼肉弁当,豚肉,320kcal 焼肉弁当,ごはん,220kcal 焼肉弁当,パスタ,90kcal 焼肉弁当,お漬物,30kcal のり弁,,600kcal 三色弁当,,600kcal

イメージ説明

上記のphpだと以下の形になってしまう。
イメージ説明

理想はこんな形です。色など装飾は無視してくださいm(_ _)m
イメージ説明

試してみたコード

<?php $lines = file('csv/sample.csv'); $first = 1; foreach($lines as $line){ $data = explode(",",$line); echo '<table>'; if(empty($data[1])){ if($first == 0) { echo '</tbody></table>'; } echo '<thead><tr><th colspan="2">'.$data[0].'</th><th colspan="2">'.$data[2].'</th></tr></thead>'; $first = 0; }else{ echo '<tbody>'; if($uni%2==0){ echo '<tr><th>'.$data[1].'</th><td>'.$data[2].'</td>'; }else{ echo '<th>'.$data[1].'</th><td>'.$data[2].'</td></tr>'; } $uni+=1; } } echo '</tbody></table>'; ?>

結果
イメージ説明

幕内弁当なら幕内弁当の具材も込みで1つのテーブルになると助かります!

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

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

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

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

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

yambejp

2018/08/21 05:18

CSVデータ次第。要サンプル
noriBanana

2018/08/21 05:25

ご連絡ありがとうございます。文面中ほどにCSVデータ貼り付けました。
guest

回答2

0

ベストアンサー

ざっくりとこんな感じ

PHP

1<?PHP 2$data=[ 3 ["幕内弁当","","400kcal"], 4 ["幕内弁当","焼き鮭","120kcal"], 5 ["幕内弁当","ごはん","220kcal"], 6 ["幕内弁当","ひじき","40kcal"], 7 ["焼肉弁当","","920kcal"], 8 ["焼肉弁当","豚肉","320kcal"], 9 ["焼肉弁当","ごはん","220kcal"], 10 ["焼肉弁当","パスタ","90kcal"], 11 ["焼肉弁当","お漬物","30kcal"], 12 ["のり弁","","600kcal"], 13 ["三色弁当","","600kcal"], 14 ]; 15 16$pre=""; 17$count=1; 18 19foreach($data as $key=>$row){ 20 if($pre!==$row[0]){ 21 if($key>0) print "</table>\n"; 22 print "<table border>\n"; 23 print "<tr>"; 24 print "<th colspan=2>".htmlspecialchars($row[0])."</th>"; 25 print "<th colspan=2>".htmlspecialchars($row[2])."</th>"; 26 print "</tr>\n"; 27 $count=0; 28 }else{ 29 $count++; 30 if($count%2==0) continue; 31 $flg=(isset($data[$key+1]) and ($row[0]===$data[$key+1][0])); 32 print "<tr>"; 33 print "<td>".htmlspecialchars($row[1])."</td>"; 34 print "<td>".htmlspecialchars($row[2])."</td>"; 35 print "<td>".($flg?htmlspecialchars($data[$key+1][1]):"&nbsp;")."</td>"; 36 print "<td>".($flg?htmlspecialchars($data[$key+1][2]):"&nbsp;")."</td>"; 37 print "</tr>\n"; 38 } 39 $pre=$row[0]; 40} 41print "</table>\n";

投稿2018/08/21 05:56

yambejp

総合スコア114843

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

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

noriBanana

2018/08/21 06:18

ありがとうございます!思った形で出力できました。 コードを見て勉強させていただきます。感謝です。
guest

0

こんな感じかな?

修正しました。

php

1<?php 2 $lines = file('csv/sample.csv'); 3 4 $first = 1; 5 $uni = 0; 6 foreach($lines as $line){ 7 $data = explode(",",$line); 8 echo '<table>'; 9 10 if(empty($data[1])){ 11 if($uni%2 == 1) { 12 echo '</tr>'; 13 } 14 if($first == 0) { 15 echo '</tbody></table>'; 16 } 17 echo '<thead><tr><th colspan="2">'.$data[0].'</th><th colspan="2">'.$data[2].'</th></tr></thead>'; 18 echo '<tbody>'; 19 $first = 0; 20 $uni = 1; 21 22 }else{ 23 if($uni%2 == 1){ 24 echo '<tr>'; 25 } 26 echo '<th>'.$data[1].'</th><td>'.$data[2].'</td>'; 27 if($uni%2 == 0){ 28 echo '</tr>'; 29 } 30 $uni+=1; 31 } 32 33 } 34 echo '</tbody></table>'; 35 36?>

申し訳ない、<tbody>を記述するのは最初だけですね。

投稿2018/08/21 05:27

編集2018/08/21 06:06
yukihisa

総合スコア672

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

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

noriBanana

2018/08/21 05:38

ご回答ありがとうございます! 出力自体はきちんとできていました。あとは幕内弁当なら具材も含めて1つのテーブルになると助かります。 質問文の下部に追記しました。
yukihisa

2018/08/21 05:50

動作確認をしなかったせいでご迷惑を。。。申し訳ないです。 明細毎に<tbody>を読み込んでいたので、修正しました。 もう少しいじるんで少々お待ちを。
yukihisa

2018/08/21 06:09

なんか汚くなってしまった。。。 とりあえずソースを生かして作るとこんな感じかと。
noriBanana

2018/08/21 06:17

元がまとまりのなかったソースをベースに考えてくださって本当にありがとうございます!
yukihisa

2018/08/21 06:22

yambejp 様提示のソースの方がきれいなので断然そちらをお勧めします。 僕の分はそのまま作る場合に何が抜けていたのかの参考程度にしてくださいませ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問