- ベストアンサー
fgetsで取り込んだ文字をexplodeで配列にしたい
こんにちは PHPの勉強を始めたばかりです。 あまり関数もたくさん知りませんが、今のところ覚えたもので、外部ファイル(TXTファイル)から文字列を引っ張り出して、スケジュール表を生成するPHPを作りたいと考えています。 カンマで区切られた文字列を格納したdata.txtというファイルがあります。 内容は 開催月,開催日,時間帯,定員,応募締切月,応募締切日 で、データとしては 6,10,AM,12,5,30 という感じで格納されています。 以下まで作ってみました。 <?php //data.txtの読み込み $rData = fopen('data.txt','r');//data.txtを読み込み専用で開き、変数rDataで扱えるようにする $i = 0; while(!feof($rData)){//eof(ファイルの終端)でない限り続ける繰り返し処理 $DataLine = fgets($rData);//1行を取り出し、変数DataLineに格納する $DataLine.$i = explode(",",$DataLine);//DataLineに格納した文字列をカンマで分割してDataLine0やDataLine1などの配列に格納 $i ++; } fclose($rData);//開いていたファイルを閉じる ?> <html> <head> <title></title> </head> <body> <?php echo $DataLine0[0]; ?> </body> </html> data.txtの1行目には、 6,10,AM,12,5,30 という文字列が入っています。 ですので、自分としてはこの処理で1行目のはじめの文字である「6」が表示されると思い込んでいたのですが、できませんでした。 画面には何も表示されません。特にエラーも表示されませんでした。 この処理の方法は何か間違っているのでしょうか。 お分かりになる方、いらっしゃいましたら、お力添えいただければ幸いです。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 まずは修正版のコードを記述します。 $rData = fopen('data.txt','r');//data.txtを読み込み専用で開き、変数rDataで扱えるようにする $i = 0; while(!feof($rData)){//eof(ファイルの終端)でない限り続ける繰り返し処理 $DataLine = fgets($rData);//1行を取り出し、変数DataLineに格納する $DataPars[$i] = explode(",", $DataLine); $i++; } それから書き出しのところ。 <?php echo $DataPars[0][1]; ?> 簡単に説明しますが、 $DataLine.$iのコードの意味はくっつけて表示という使い方はしますが、変数名として合体させる力はありません。 $DataLine.$i = explode(",",$DataLine); //NG ですので、配列として、 $DataPars[$i] = explode(",", $DataLine); としてあげることで、配列名と番号のセットされたものに、explodeで作られた配列が入ります。 配列の中に、さらに配列を入れてあげます。 これを1回のセットとしてループしてあげれば、 $DataPars[0] = 1行目の配列 $DataPars[1] = 2行目の配列 というように続きます。 そして、$DataPars[0]この配列の中にある配列を呼び出すには、 $DataPars[0][0] = 1行目の配列の0番目のカラムというようにしてあげましょう。
その他の回答 (1)
- sakusakerZ
- ベストアンサー率25% (1/4)
> $DataLine.$i = explode(",",$DataLine);//DataLineに格納した文字列をカンマで分割してDataLine0やDataLine1などの配列に格納 ここの考え方が間違っています。 この書き方だとexplode の結果は $i という変数に格納されます。 決して、 Dataline に $iの内容(まあexplodeでぶっ壊されているのは置いといて) を連結した名前の新しい変数(DataLine1とか)に代入されるわけではありません。 可変変数というものでお望みのことをできなくもありませんが、 素直に配列を使うことをオススメします。
お礼
早速のご回答ありがとうございます。 教えていただいたとおり、「$DataLine.$i」という表現を「$DataLine2」に変更して「echo $DataLine2[0]」とすることで、最終行の先頭データを表示することができました。 となれば、この方法では、たとえばdata.txtにレコードが10件入っていたとしても、各レコードを別々の変数に入れておくことは難しいでしょうか。 別々に格納しておくことができれば、後々、HTML側への出力として <?php echo $DataLine0[0].'月'.$DataLine0[1].'日'.$DataLine0[2].…; echo $DataLine1[0].'月'.$DataLine1[1].'日'.$DataLine1[2].…; echo $DataLine2[0].'月'.$DataLine2[1].'日'.$DataLine2[2].…; ・ ・ ?> といったようなことが可能になるかな?と思い、自分なりに作ってみたのがはじめに記載したものでした。 もう少し、試行錯誤してみます。 ありがとうございました。
お礼
ご回答ありがとうございます。 教えていただいた方法でできました! すごい! 配列の中に、配列が作れるんですね! まだまだ勉強不足です。 でも、教えていただいたことで、また少し壁を越えることができました。 ありがとうございました!!!