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

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

ただいまの
回答率

90.35%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 723

Chelsea_10

score 39

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

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

現状

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

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

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

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

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

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

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

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

//CSVダウンロード
     function toCsv($csvStr, $filename) {
    $fp = fopen('php://temp', 'r+');    //PHPメモリ上の一時ファイルとして作成する
    fwrite($fp, $csvStr);     // 一時ファイルに書き込む
    rewind($fp);     // 書き込んだデータを読み込みなおす
    $csv = stream_get_contents($fp);    // ファイルストリーム作成
    fclose($fp);

    $fname = $filename;

    //ダウンロード処理
    header('Content-Disposition:attachment; filename="'.$fname.'.csv"');
    header('Content-Type:application/octet-stream');
    header('Content-Length:'.strlen($csv));
    echo $csv;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

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

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

$fp = fopen('testdata.csv','w');
    foreach($csvStr as $data) {
        fwrite($fp,$data."\n");
    }
    fclose($fp);

    //ダウンロード処理
    header("Content-Type: application/octet-stream; charset=sjis-win");
    header("Content-Disposition: attachment; filename=testdata.csv");
    foreach($csvStr as $data) {
        $data = mb_convert_encoding($data, 'sjis-win', 'utf-8');
        echo $data;
        echo "\n";
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/09 20:54

    このコードであれば
    fopen('testdata.csv','w');
    foreach($csvStr as $data) {
    fwrite($fp,$data."\n");
    }
    fclose($fp);

    の部分は無くても大丈夫ですね。

    キャンセル

  • 2016/06/09 21:17

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

    キャンセル

checkベストアンサー

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 19:20

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

    キャンセル

  • 2016/06/09 20:45

    大変ご協力いただきましてありがとうございました。

    最終的に行いたかったのは
    ・CSVをブラウザにダウンロードさせる
    です。

    いろいろ勘違いをしてしまい、よく見直したらできました。
    コード共有いたします!
    ありがとうございました!!

    キャンセル

  • 2016/06/09 20:53

    解決してよかったです。
    またコードの共有ありがとうございます。

    補足として、
    最初に試されようとしていた方法は、
    「ダウンロード残り時間を表示させるため、一時ファイルを用意することでコンテンツ容量をHTTPヘッダに記載する。そのコンテンツはファイルから読みだして出力する」
    という方法の途中だったんだと思います。

    単純にダウンロードさせるだけなら、現在お試しになった方法で問題無いです。

    キャンセル

0

ご提示のコードの

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


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


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


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

var_dump($csvStr);


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る