2017-02-15 14 views
1

皆さん。今日私はかなり理解していないPHPのwhileループの例を見ました。サンプルPHPを理解するのに役立つ必要があります。

Complete code

// Open XML file 
$fp=fopen("note.xml","r"); 

// Read data 
while ($data=fread($fp,4096)) {   // Line about which I have questions 
    xml_parse($parser,$data,feof($fp)) or 
    die (sprintf("XML Error: %s at line %d", 
    xml_error_string(xml_get_error_code($parser)), 
    xml_get_current_line_number($parser))); 
} 

whileループ括弧内の式$data=fread($fp,4096)は全く変化していないようです。 1つの代入文です。このループはどのように終了するのですか? 解析の完了時に関数xml_parse($parser,$data,feof($fp))が終了することがありますが、ループがwhileループのテスト条件にどのように影響するかはわかりません。私は、XMLファイルの解析が無限に繰り返されると感じています。ループのテスト条件として代入式がある場合に

はまた、私たちは本当にちょうど割り当て利回りTRUEまたはFALSERIGHT側ならばループを終了するか否かを判断するために参照するために探していますか?私はこれに疑問を抱いています。$dataは一度割り当てられてから常にTRUEを返すので、この例では無限ループが生成されるためです。

おかげ

+0

freadがファイルの最後に到達すると、nullが$ dataに返され、falseになるのでwhileループは停止します – SIDU

答えて

1

fread()関数がfalseを返したときにそれがファイルの終わりに達したときにいた、終了します。あなたは、関数freadのためのPHPのドキュメントでこれを確認することができます割り当ての評価についてのご質問については

http://php.net/fread

を、PHPであなたは割り当てを評価するとき、それは異なる(変数の最終値を返します。基本的には、関数の変数に値を割り当てて、その関数の結果(変数に割り当てられている)を余分な構文なしで評価しています。

+0

これは、ファイルの読み取り中に割り当てが行われていることを意味します。 –

+0

はい、fread()はファイルからデータを読み込もうとしますが、可能であれば返します。そうでない場合はfalseを返します。読み込まれたデータは変数に代入されます。偽です。'while'ステートメントは、' $ data'変数の最終値を評価し、それが "真"(例えば、値がfalse、ヌル、ゼロ、空の文字列、空の配列)、それは終了する。 – ablopez

+0

あなたのオリジナルの答えとPHP:fread-Manualを再読み込みしましたが、今は理解していると思います。ありがとう –

0

作業

while(there is data to read) OR (!EOF) 

break when reach (EOF==true) OR no data to read OR return false 

* EOF (end of file)

0

PHPマニュアルが言うように、機能freadを読み取り、文字列、失敗した場合にFALSEを返します。上記の文で

$data=fread($fp,4096)

$dataの値は、ファイルの内容がnote.xmlfalseのいずれかである:意味

。 ご存知のとおり、whileループは条件がfalseになるまで続きます。この文は、fread($fp,4096)関数がファイルからデータを読み取ることができないとき、読み取るデータが残っていないときにのみ、falseです。

+0

ありがとう。しかし、私はあなたが言ったことを理解できません。たとえば、$ data = fread($ fp、4096)がwhileループの外側にある通常の文であるとします。 $ dataは役に立たないでしょう。なぜなら、データが残っていない時がいつもあるように、最終的には常に偽になるからです。 –

+1

確かに、このトリックはwhileループの中でwhileループを実行して結果がFALSEになるまで使用されています – Imran

+0

Upvoteがそれを指摘しています。 –

関連する問題