重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんにちは
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」が表示されると思い込んでいたのですが、できませんでした。
画面には何も表示されません。特にエラーも表示されませんでした。

この処理の方法は何か間違っているのでしょうか。
お分かりになる方、いらっしゃいましたら、お力添えいただければ幸いです。
よろしくお願いいたします。

A 回答 (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番目のカラムというようにしてあげましょう。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

教えていただいた方法でできました!
すごい!
配列の中に、配列が作れるんですね!
まだまだ勉強不足です。

でも、教えていただいたことで、また少し壁を越えることができました。
ありがとうございました!!!

お礼日時:2008/06/09 16:13

> $DataLine.$i = explode(",",$DataLine);//DataLineに格納した文字列をカンマで分割してDataLine0やDataLine1などの配列に格納



ここの考え方が間違っています。

この書き方だとexplode の結果は $i という変数に格納されます。
決して、 Dataline に $iの内容(まあexplodeでぶっ壊されているのは置いといて)
を連結した名前の新しい変数(DataLine1とか)に代入されるわけではありません。

可変変数というものでお望みのことをできなくもありませんが、
素直に配列を使うことをオススメします。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。

教えていただいたとおり、「$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].…;


?>
といったようなことが可能になるかな?と思い、自分なりに作ってみたのがはじめに記載したものでした。

もう少し、試行錯誤してみます。
ありがとうございました。

お礼日時:2008/06/09 16:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!