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

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

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

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

Q&A

解決済

2回答

2695閲覧

fgetcsv()

MISHIRO

総合スコア27

PHP

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

0グッド

0クリップ

投稿2017/09/22 07:16

下記のサイトを見ていたのですがこのコードで記述されているfgetcsvの使われ方はどのような意味なのでしょうか?

php

1# 一時ファイルのデータを再度CSVとして読み込む 2while(($data=fgetcsv($temp,0,",")) !== false){ 3 $csv[] = $data; 4}

fgetcsvで検索をかけても

php

1fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = "," [, string $enclosure = '"' [, string $escape = "\" ]]]] )

という書き方のものの解説は出てくるのですが今回問題となったコードの解説は見当たりませんでした。
このコードについて解説をお願いします。

またこのサイトを見る限りですとCSVを一時ファイルとして作り直していると読み取れるのですが
その場合、元のCSVと形が変わっていることはないのでしょうか?

参考サイトURL:http://php.ex-mode.net/mb/s/contents.php?n=chap4_7

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

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

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

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

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

guest

回答2

0

ベストアンサー

ごめんなさい、どこがわからないかわからないので、ざっと何をしているかだけ

  • fgetcsv($temp,0,",")

まず$tempは事前にfopenで開いた状態を保持しているインスタンスです
$tempから抜き出して1行を0文字分=まるまる1行分読み取ってcsvとして解釈します
その際のデリミタ(=文字間をきりわける記号)に「,」を使います

  • $data=fgetcsv($temp,0,",")

fgetcsvで得た1行分配列データを$dataに代入します

  • while(($data=fgetcsv($temp,0,",")) !== false){・・・}

$dataがfalseになる場合はファイルの最後まで読んだことになります
falseでない場合は、データがあるということなのでwhile内を実行します

  • $csv[] = $data;

$csvの最後に1つデータを拡張して、$dataを代入します。
具体的には

PHP

1if(!isset($csv)) $csv=[]; 2$csv[count($csv)==0?0:(max(array_keys($csv))+1)]=$data; 3

もう少し分解すると

PHP

1if(!isset($csv)) $csv=[]; 2if(count($csv)==0){ 3 $key=0; 4}else{ 5 $key=max(array_keys($csv))+1) 6} 7$csv[$key]=$data;

と同等の処理です(もうすこし解釈がわかれますが)

投稿2017/09/22 07:36

編集2017/09/22 08:02
yambejp

総合スコア114769

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

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

MISHIRO

2017/09/22 07:56

詳しい説明ありがとうございます。 とても分かりやすく助かりました。 $csv[count($csv)==0?0:(max(array_keys($csv))+1)]=$data; とのことなのですが解説していただけませんでしょうか。 まだPHPのことをほぼ知らない状態でうまく解釈できませんでした。
yambejp

2017/09/22 08:00

> $csv[count($csv)==0?0:(max(array_keys($csv))+1)]=$data; も$csvの要素数が0だった場合0 そうでない場合は$csvのキーにある最大値に1をたした数字 をキーにした$csvに$dataを代入するという意味です。 本文にちょっと追記しておきます
MISHIRO

2017/09/22 08:12

追記していただきありがとうございます。 わかりやすくなりました。 すみません。 もう一点質問させていただきたいのですが csvの内容が 名前(姓),名前(名),名前(セイ),名前(メイ) 田中,一郎,タナカ,イチロウ で、$csvの中身が何もなかった場合は $csv[0][0]=名前(姓); $csv[0][1]=名前(名); $csv[0][2]=名前(セイ); $csv[0][3]=名前(メイ); $csv[1][0]=田中; $csv[1][1]=一郎; $csv[1][2]=タナカ; $csv[1][3]=イチロウ; という状態になるのでしょうか?
yambejp

2017/09/22 08:19

print_r($csv)するとこう戻ります。 Array ( [0] => Array ( [0] => 名前(姓) [1] => 名前(名) [2] => 名前(セイ) [3] => 名前(メイ) ) [1] => Array ( [0] => 田中 [1] => 一郎 [2] => タナカ [3] => イチロウ ) )
MISHIRO

2017/09/22 08:25

なるほど。 何度もコメントしていただきありがとうございました。 とてもわかりやすく記述してくださったおかげて理解できました。
guest

0

PHPマニュアルにきちんと説明が書いてあるように思いますが・・

ファイルポインタから行を取得し、CSVフィールドを処理する
fgetcsv() は行を CSV フォーマットのフィールドとして読込み処理を行い、 読み込んだフィールドを含む配列を返すという違いがあります。

書き込み可のモード (w+) でユニークな名前を有するテンポラリファイルを作成し、 ファイルハンドルを返します。
ファイルをクローズした場合や、スクリプトが終了したりしたときに、このファイルは自動的に削除されます。

これをご提示のサイトのコードに当てはめて要約すると
list.csvの内容を一時ファイルにうつした上で1行ずつ行がなくなるまで読み込み、「,」を列の区切りとして配列でデータを取得する(最大行長は制限しない)。スクリプトと終了同時に一時ファイルは削除される
ですね。

つまり、csvを作り直しているわけではなく、csvをメール配信リストとして「データとして(テンポラリファイルにうつして)」取り込み、
取り込んだデータを行毎に取得した配列として後ほどループし、1件ずつメール送信を行っている、ということです。
情報を読み込んでいるだけなので元のcsvにはなんら影響しません。

投稿2017/09/22 07:35

編集2017/09/22 07:42
m.ts10806

総合スコア80850

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

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

MISHIRO

2017/09/22 07:49

回答ありがとうございます。 確かに書かれてはいたのですが、どういう意味なのか理解できず質問させていただきました。 csvでの記述が 名前(姓),名前(名),名前(セイ),名前(メイ) 田中,太郎,タナカ,タロウ となっていた場合 配列には csv[0]="田中" csv[1]="太郎" csv[2]="タナカ" csv[3]="タロウ" という形で入るのでしょうか?
m.ts10806

2017/09/22 07:52

ちょっと違いますね。 $data[0] = "田中" ・・・ となるはずです。 実際にcsvを用意して動作させてみてはいかがでしょうか。
MISHIRO

2017/09/22 08:13

環境が作れ次第試してみようと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問