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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

配列

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

Q&A

解決済

3回答

1814閲覧

配列を3段区切りにして、csvに出力したい

Chelsea_10

総合スコア46

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

配列

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

0グッド

1クリップ

投稿2016/06/09 08:54

編集2016/06/09 08:56

お世話になっております。

データベースからphpでデータを引っ張って、最終的に
会社名 名前 メールアドレスと3列でデータをcsv形式に書き出す処理をしたいのですが、コンマ形式で配列に落としこむことはできたのですが、その後で詰まっている状態です。。。

現状

$csvStr[0] = "株式会社aa,name1,mail1";

$csvStr[1] = "株式会社bb,name2,mail2";

$csvStr[2] = "株式会社cc,name3,mail3";

のように書き出すことができました。

あとは
会社名 ユーザ名 メール と3列で
折り返し、データを配列ごとに入れ込みcsvデータにしたいのですが
どのようにすればよいでしょうか。。?

おそらく改行させて、だし終わったらまた改行させるようにすればよいと思うのですがどう書けばいいか理解できていないです。。

お手数ですが宜しくお願いします(_ _)

ここは途中までですが、
csvデータに名前を加えて、csvデータ形式でダウンロードする関数です。
ここが最終プロセスだと思うのですが、その途中までがわからない。
という状態です。 宜しくお願いします

php

1 2 //CSVダウンロード 3 function toCsv($csvStr, $filename) { 4 $fp = fopen('php://temp', 'r+'); //PHPメモリ上の一時ファイルとして作成する 5 fwrite($fp, $csvStr); // 一時ファイルに書き込む 6 rewind($fp); // 書き込んだデータを読み込みなおす 7 $csv = stream_get_contents($fp); // ファイルストリーム作成 8 fclose($fp); 9 10 $fname = $filename; 11 12 //ダウンロード処理 13 header('Content-Disposition:attachment; filename="'.$fname.'.csv"'); 14 header('Content-Type:application/octet-stream'); 15 header('Content-Length:'.strlen($csv)); 16 echo $csv; 17}

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

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

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

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

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

guest

回答3

0

ご協力いただきましてありがとうございました!!
大変感謝しております!!

下記コードになります(_ _)

php

1$fp = fopen('testdata.csv','w'); 2 foreach($csvStr as $data) { 3 fwrite($fp,$data."\n"); 4 } 5 fclose($fp); 6 7 //ダウンロード処理 8 header("Content-Type: application/octet-stream; charset=sjis-win"); 9 header("Content-Disposition: attachment; filename=testdata.csv"); 10 foreach($csvStr as $data) { 11 $data = mb_convert_encoding($data, 'sjis-win', 'utf-8'); 12 echo $data; 13 echo "\n"; 14 }

投稿2016/06/09 11:43

Chelsea_10

総合スコア46

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

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

tanat

2016/06/09 11:54

このコードであれば fopen('testdata.csv','w'); foreach($csvStr as $data) { fwrite($fp,$data."\n"); } fclose($fp); の部分は無くても大丈夫ですね。
Chelsea_10

2016/06/09 12:17

本当ですね!! ありがとうございます!
guest

0

ご提示のコードの

php

1fwrite($fp, $csvStr); // 一時ファイルに書き込む

php

1fwrite($fp, implode(PHP_EOL, $csvStr)); // 一時ファイルに書き込む

に修正してみてください。
http://php.net/manual/ja/function.implode.php


上記でうまくいかない場合、変数$csvStrがご質問にあるような配列形式になっていない可能性があります。
その場合、
「どのような結果になったのか」

php

1var_dump($csvStr);

という1行を追加して再実行し、表示されたメッセージを質問欄に追記願います。

投稿2016/06/09 10:15

KiyoshiMotoki

総合スコア4791

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

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

0

ベストアンサー

$csvStr[0] = "株式会社aa,name1,mail1";

$csvStr[1] = "株式会社bb,name2,mail2";
$csvStr[2] = "株式会社cc,name3,mail3";

まで出来ているのであれば、あとは配列をループさせ、一回ループするごとに改行コードを表示すればOKです。

配列のループはforeach,for,whileなどの繰り返しの制御構文を使用します。
中でも、foreachは特に便利です。
参考URL
上記にforeachの使い方が丁寧に解説されていますので、
確認してみて下さい。

今回のケースでは、foreachの中で値をechoした後に、改行コード(PHP_EOL)をechoする様な形になります。

その上で不明な点がある様でしたら、配列の操作部分の具体的なソースを提示されると
より具体的な回答が得られるかと思います。

投稿2016/06/09 09:15

tanat

総合スコア18709

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

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

Chelsea_10

2016/06/09 09:29 編集

ご回答ありがとうございます! 完成度80%までできているのがわかるのですが、 今回のケースでは、foreachの中で値をechoした後に、改行コード(PHP_EOL)をechoする様な形になります。  ↑こちらは foreach($csvStr as $data) { echo "$data"; echo "\n"; } にすると思うのですが、その後をどのようにして csvファイルとして保存させればよいかわからなくて・・・
tanat

2016/06/09 09:35

質問で提示されたコードの echo $csv; を foreach($csvStr as $data) { echo "$data"; echo "\n"; } にすればダウンロードされませんか? *ブラウザによってはダウンロードされずに表示されてしまうかも。 出力された文字列をHTTPヘッダ情報と合わせてダウンロードするかそのまま表示してしまうかはブラウザ側の仕事になるので、 サーバ側(PHP)では、 ・適切なHTTPヘッダを表示する ・その後、コンテンツを表示する を行います。
Chelsea_10

2016/06/09 09:50

tanatさん ダウンロードはされるのですが 何も表示されないです。。。 どこの部分をおっしゃっていますか。。。?
tanat

2016/06/09 10:17

ダウンロードはされるが何も表示されないというのはどういう状態でしょうか? ダウンロードされたファイルが空なのか、 ダウンロードされた後、ブラウザに何も表示されないのか?
tanat

2016/06/09 10:20

すみません、最終的に行いたいことは ・サーバにCSVを保存する なのか ・CSVをブラウザにダウンロードさせる 事なのかどちらでしょうか? もしくは両方共でしょうか?
Chelsea_10

2016/06/09 11:45

大変ご協力いただきましてありがとうございました。 最終的に行いたかったのは ・CSVをブラウザにダウンロードさせる です。 いろいろ勘違いをしてしまい、よく見直したらできました。 コード共有いたします! ありがとうございました!!
tanat

2016/06/09 11:53

解決してよかったです。 またコードの共有ありがとうございます。 補足として、 最初に試されようとしていた方法は、 「ダウンロード残り時間を表示させるため、一時ファイルを用意することでコンテンツ容量をHTTPヘッダに記載する。そのコンテンツはファイルから読みだして出力する」 という方法の途中だったんだと思います。 単純にダウンロードさせるだけなら、現在お試しになった方法で問題無いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問