こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHPでfile()を使った際の配列の要素について

PHPのfile関数の動作について質問させて頂きます。
テキストファイルからfile()を使って配列に各行のデータを取り込んだのですが、その配列から特定の要素を探そうとしたところ、検出できませんでした。

テキスト.txtの内容-------
AAA
BBB
CCC
---------------

$array = file("テキスト.txt");
$word = "AAA";
$keys = array_keys($array,$word);
var_dump($keys);

簡略化しましたが、こんな感じで実行するとAAAが格納されているはずの[0]番目のkeyは検出されません。

bar_dumpを使って$array[0]と$wordを確認してみたところ、以下のようなデータが帰ってきました。
$array[0] → string(5) "AAA"
$word → string(3) "AAA"
まったく同じ文字列なのに、配列の方の長さが2ほど大きくなっています。

そこでtrimを使用してみたところ、配列からこの謎の2バイト?のデータが削除できました。
検索も正しく動作するようになりました。
文末に改行が入ってるのかとも思ったのですが、\nを削除する処理では検索が出来なかったので、不思議に思っております。

テキストファイルから取り込んだ際に、文字列の前か後ろに何らかの文字が入っているのだと思うのですが、実際どのような文字が入っているのでしょうか?

----------------------------------

それともう一つお聞きしたいのですが、

テキストファイル内容がある程度長い(100行以上、または1万文字以上など)場合、file()で配列にデータを取り込むのは負荷が大きかったりするのでしょうか?
fgetsで1行ずつ取り出して比較する方法も考えたのですが、処理の繰り返しと取り込むデータの大きさのどちらに配慮するべきか悩んでいます。

もし100行や1万文字が多い・少ないという感覚になる場合、実際「配列にするには大きすぎる」という感覚はどれくらいの容量から考えるべきでしょうか?

後半の質問につきましては明確な答えで無くても、「自分はこう感じる」というような感覚的なご意見でもお聞きしたいと思っています。

お手数をおかけしますが、どうぞよろしくお願い致します。

投稿日時 - 2013-02-27 20:14:49

QNo.7967715

困ってます

質問者が選んだベストアンサー

そのテキストファイルをWindowsで作ったなら、改行はCRLF(\r\n)の2文字で表されています。プログラム中で\nと書くと自動的に\r\nで表示するのでわかりにくいとは思いますが。
CR(\r)で1文字、LF(\n)で1文字使うので、trimしたら消える謎の2文字の理由が説明できると思います。

もしそうなら、$word = "AAA";ではなく、$word = "AAA\r\n";とするとarray_keysでお目当てのものが見つかるでしょう。

そのマシンであなたが使えるメモリーの容量、同時に実行されるプログラムの数、プログラム中でfileで取得するファイルの数にもよるのではないでしょうか。
メモリーの容量が限られていて、同時実行数、fileで読み込むファイルの数ともに多いなら、数キロバイト程度の小さなファイルでもfopenでファイルを開いてfreadや長さを指定したfgetsで決まった量だけ読み込んで処理するようにしたほうがよいと思います。逆に、メモリーがたくさんあって、同時にプログラムが実行されることもなく、ファイルも数個しか無いなら数百メガバイトのファイルでもfileで開けば良いと思います。

メモリーバカ食いな方がプログラミングは楽で、スピードが出ると思うので、まずはメモリーバカ食いな実装で最初作っておいて、それだとメモリーの制限で止められるようになったり、スラッシングが起きるようになったりしてきたら、節約したプログラムに切り替えると良いでしょう。でも、データを入れるときには構造化しておくと思うので、普通はわざわざテキストに改行してデータを入れておくような実装にするよりもRDBMSなどを検討しませんか?

投稿日時 - 2013-02-28 01:04:20

お礼

ありがとうございます。
trimで一応解決はしたものの、謎が残りもやもやしていた部分が解消致しました。

メモリのお話もとても判りやすかったです。
頻繁な呼び出しはしないと想定していますので、fileのままでとりあえず進めてみようと思います。

RDBMSとは、MySQLやSQLiteなどのことですよね。
確か無料で使用できるのはSQLiteでしたでしょうか・・・(うろ覚えなのですけど)
データベースが使える言語はPHPが初めてで、まだ覚え始めのため関数や機能を把握しきれていない状態です。
Accessでプロジェクトを作るのと同じような感覚で使えるのでしょうか?
テーブルは何らかのファイルが生成されて保存され、クエリはメモリ上で動くイメージなのかなと想像していますが、まだ未知の領域なので追々勉強して行こうと思います。

とても丁寧なアドバイスを頂き、本当にありがとうございました。

投稿日時 - 2013-02-28 11:14:15

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問