ファイルの入出力で変数に当てはめる方法 - PHPプロ!Q&A掲示板

2539

  • 0P

ファイルの入出力で変数に当てはめる方法

質問日時 / 2010年2月17日 11:31    回答数 / 6件

Questioner:  gin_taka  このエントリーをはてなブックマークに追加 

キーワード / ファイル    入出力    可変   

phpでファイルの読み書きを勉強している者です。
雛型ファイルを読み込み、そこに値を当てはめて、新規に出力する処理を作りたいと考えています。
そこで質問なのですが、たとえばC言語だったら、


printf("%d", hoge)


といった書き方で、%dのところにhoge変数に入ってる値を当てはめることができたかと思います。
phpでも、似たようなやり方でファイル出力をすることができるでしょうか?


たとえば、phpに取り込んだときに下記のように見えるcsvファイルがあるとします。

No,Name,Gender
%d,%s,%s


csvでのイメージは下記です。

 No | Name | Gender
------------------------
 %d | %s | %s


その2行目に当たる「%d,%s,%s」の部分それぞれに、DB検索で得た値を埋め込んで、
結果一覧としてcsvに出力させたいのです。


今現在は、「%d,%s,%s」のところにそれぞれ、「hoge1,hoge2,hoge3」という文字列を入れ、
php側で変数に格納させたりというやり方をとっています。


以下例

$line = array(
'0' => 'hoge1',
'1' => 'hoge2',
'2' => 'hoge3'
);

$data⇒検索結果を格納した配列


foreach($data as $key1 => $value1){
$search_result = $value1['hoge_table'];
foreach($line as $key2 => $val2){
if (empty($list)){
$list = $search_result[$val2]; //※
} else {
$list = $list . "," . $search_result[$val2];
}
}
}


上記の書き方では、なぜか※のところで、 「Undefined index:hoge3」というエラーメッセージが表示されます。
項目を増やしても減らしても、最後のところに入ってる値で止まってしまいます。
未定義と怒られているようなのですが、ほかの部分ではそれは表示されないし…で、詰まってしまいました。
何か同じような問題にあたった方がいましたら、ぜひアドバイスをいただけないでしょうか?

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimix>上記の書き方では、なぜか※のところで、 「Undefine
 ┗A01-1gin_takaはい、$dataはた次元配列になります。 実行した
  ┗A01-1-1shimix>原因として考えられるのは、検索の結果が $search_r
   ┗A01-1-1-1gin_taka>それを確認するためにvar_dumpしていただいたのです
    ┗A01-1-1-1-1shimix>list=, key=0, val=hoge1 >list=01, key=1, val=hog
     ┗A01-1-1-1-1-1gin_taka>list=, key=0, val=hoge1 >list=01, key=1, val=hog

回答一覧

並び替え:

A01
answerershimix [2月17日 11:49] (最終編集:2月17日 11:56)

>上記の書き方では、なぜか※のところで、 「Undefined index:hoge3」というエラーメッセージが表示されます。

$dataは多次元配列ということでいいんですよね?


$search_result = $value1['hoge_table'];

のあとで

var_dump($search_result);

を実行してみてください。


(蛇足)
ちなみに、printfの第一引数(format)は変数でもかまいません(内容が文字列であること)。

  http://www.php.net/manual/ja/function.printf.php

この意見に回答する

ツリーへ TOPへ

A01-1
replyergin_taka [2月17日 12:06]

はい、$dataはた次元配列になります。


実行した結果ですが、$dataに格納されているものが、《[key]=> 型 値》の形で表示されました。
ちなみに、 hoge3 は下記のように表示されています。(hoge3は日時データになります)

["hoge3"]=>  string(19) "2010-02-16 17:14:30"


原因として考えられるのは、検索の結果が $search_result に格納されていない、
というのが挙げられるのでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyershimix [2月17日 12:35]

>原因として考えられるのは、検索の結果が $search_result に格納されていない、
>というのが挙げられるのでしょうか? 

それを確認するためにvar_dumpしていただいたのですが(汗

>foreach($line as $key2 => $val2){

この直後に

print 'list=' . $list . ', key2=' . $key2 . ', val2=' . $val2 . '<br />' . PHP_EOL;

を入れてみてください(Undefined index: hoge3までにhoge1,hoge2が処理されているかも含めてチェック)。


#例示されているように、hoge1,hoge2,hoge3はソース内で定義されていますよね?
#ファイルからだと(trimしていないと)文字列としての評価が違っている可能性があるので・・

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyergin_taka [2月17日 13:22]

>それを確認するためにvar_dumpしていただいたのですが(汗

こちらから何も申し上げなかったので上記の確認コマンドを提示してくださったんですね、
説明不足で大変申し訳ありません。


>print 'list=' . $list . ', key2=' . $key2 . ', val2=' . $val2 . '<br />' . PHP_EOL;
>を入れてみてください(Undefined index: hoge3までにhoge1,hoge2が処理されているかも含めてチェック)。

ということでしたので、組み込んで実行してみましたところ、下記の結果が得られました。

list=, key=0, val=hoge1
list=01, key=1, val=hoge2
list=01,名前, key=2, val=hoge3
list=, key=0, val=hoge1
list=02, key=1, val=hoge2




※$listに関してですが、中側のforeachを抜け、外側のforeach終わりの「}」の前で初期化してあります。


> #例示されているように、hoge1,hoge2,hoge3はソース内で定義されていますよね?
例示していたのはあくまで$lineの構造を目に見える形にしたもので、
ソース内では定義していませんが…やはりこれが問題でしょうか?;;

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1 満足
replyershimix [2月17日 13:44]

>list=, key=0, val=hoge1
>list=01, key=1, val=hoge2
>list=01,名前, key=2, val=hoge3
>list=, key=0, val=hoge1
>list=02, key=1, val=hoge2

この途中でエラーメッセージが混じるんでしょうか?ブラウザ側のソースを確認したときに「hoge3」と「<br />」の間で改行していたりはしませんよね?

>例示していたのはあくまで$lineの構造を目に見える形にしたもので、
>ソース内では定義していませんが…やはりこれが問題でしょうか?

ファイルから取得した行から抜き出しているとしたら(hoge3が最後の項目だとしたら)行末の改行コードをカットするための行データのtrimはありますよね?

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyergin_taka [2月17日 14:04] (最終編集:2月17日 14:10)

>list=, key=0, val=hoge1
>list=01, key=1, val=hoge2
>list=01,名前, key=2, val=hoge3



>list=, key=0, val=hoge1
>list=02, key=1, val=hoge2

>この途中でエラーメッセージが混じるんでしょうか?

エラーですが、上記※のところ、つまり1件目と2件目の間で表示されていました。
そして、shimix様が最後におっしゃった、


>行末の改行コードをカットするための行データのtrimはありますよね? 


もしかして…と思ったら、これが原因でした;;
取得した文字列にtrimをかけたところ、エラーは表示されなくなりました。
もともと存在する改行のことがすっかり頭から抜け落ちていました。。。

基本的な部分がまだまだ足りていないようです、ご迷惑をおかけしました;;
ここまで丁寧にアドバイスくださり、ありがとうございましたm(_ _)m

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
セッションがいいのか、それともデータベースがいいのか教えて下さい。
 このエントリーをはてなブックマークに追加 
A
>ボタンをクリックしたら選んだ商品情報を持っておきたいと思っています。 そのくらいのことならセッションもしくはCookie(期限短め:場合によってはブラウザ閉じるまで)でいいんじゃないですかね。 #わ...

>>続きを読む

一つの目安として、ECサイトの購入情報など絶対に消えてはいけないものはDBに、カートなどの一時的に使用する情報や、ユーザに任意のタイミングで消去されても構わないものはセッションにと使い分けるといいでしょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)