2016-10-24 8 views
0

私はphpを初めて使っています。これは私の最初の言語です。だから私の質問は非常に基本的なようだ。明示的なインクリメント/カウンタなしのループwhile(basic)

まず、whileループの基本的な概念は私には明らかです。 "クラッシュ条件"(i < 10)が真になるまで増分(i ++)する限り。

しかし、明示的なインクリメントなしの次のコード例がなぜ機能するのか、本当に不思議です。

$originals = "originale"; 
$thumbnails="thumbnails"; 
$directory = opendir($originale); 
$images = array(); 
while(($file = readdir($directory)) !== false) { 
    if(preg_match("/\.jp?g$/i", $file)){ 
     $images[] = $file; 
    } 
} 
echo "<pre>"; 
var_dump($images); 
echo "</pre>"; 
closedir($directory); 

明らかに私は何かを逃しました。それは魔法のようです。私は最初のファイルを返す無限ループを期待するだろう...?

私の英語にもかかわらず(申し訳ありませんが)問題は明らかになることを願っています。 事前に感謝します。

+2

whileループwhile * while中括弧内の条件は真です。この場合の条件は '($ file = readdir($ directory))'です。これはディレクトリから新しいファイル名を$ fileに割り当てようとし、新しいファイルがない場合はfalseを返します。 **しかし:**基本的なコードの説明は、SOのためにかなりオフトピックです - これはチュートリアルのサイトではありません。 [あなたの選択の検索エンジン]はあなたのニーズに適したかなりのものを提供します。 –

+1

whileループはインクリメンタル値を持つ必要はないので、ループを壊すために_something_がある限り、この場合は '$ file'がfalseに設定されています。 – Epodax

+1

readdirはポインタを進め、ポインタがディレクトリの終わりに達するとfalseを返します。 –

答えて

2

あなたはPHP documentationreaddirで見ることができるようにします:

は、ディレクトリ内の次のエントリの名前を返します。エントリは、ファイルシステムによって格納された順に返されます。

したがって、readdirを呼び出すたびに、そのディレクトリから次のファイルが返されます。例えば

あなたは2つのファイルとdirecotryがある場合:

  • one.txt
  • two.txt

あなたはreaddirone.txtを返します呼び出し初めて。そして、これはとてもtwo.txtと上記と同様に返されます、あなたがreaddirを呼び出すwhile

二時間内のコードを実行しますfalseは異なっています。

readdirと呼ぶ時間はfalseとなり、それ以上のファイルがディレクトリにないためです。 whileからの条件はもはや真でなくなり、もはや入力しなくなります。

+0

ありがとうございました!私はマニュアルを読んでも、私はその橋を渡ることができませんでした。あなたが私に文脈を与えるようになったので、それはもっともらしい。私は同じコンセプトに何度も直面していました。今あなたは私をポイントにもっと近づけるようです。 –

関連する問題