Affamative Way

前向きにグダグダいいながらコード書く

ディレクトリ内のファイル一覧を取得する

googleにて「php ディレクトリ ファイル一覧」と検索したところこのページが一件目にHIT
readdir:ディレクトリ内のファイル一覧を取得する
しかしながら間違ってるというオチ。。。
同じこと調べる人がコッチにくるといいなぁということでエントリ。


以下、間違ってるサンプルコード

<?php

//ディレクトリ・ハンドルをオープン
$res_dir = opendir( '.' );

//ディレクトリ内のファイル名を1つずつを取得
while( $file_name = readdir( $res_dir ) ){
	//取得したファイル名を表示
	print "{$file_name}\n";
}

//ディレクトリ・ハンドルをクローズ
closedir( $res_dir );

?>


正しくは以下のように取得してやる
PHP: readdir - Manualより引用

警告

この関数は論理値 FALSE を返す可能性がありますが、FALSE として評価される 0 や "" といった値を返す可能性もあります。詳細については 論理値のセクションを参照してください。この関数の返り値を調べるには ===演算子 を使用してください。

<?php
// 4.0.0-RC2 より前のバージョンでは、!== は存在しないことに注意しましょう

if ($handle = opendir('/path/to/files')) {
    echo "Directory handle: $handle\n";
    echo "Files:\n";

    /* ディレクトリをループする際の正しい方法です */
    while (false !== ($file = readdir($handle))) {
        echo "$file\n";
    }

    /* ディレクトリをループする際の「間違った」方法です */
    while ($file = readdir($handle)) {
        echo "$file\n";
    }

    closedir($handle);
}
?> 


上の取得方法がそのまま公式マニュアルにご丁寧に

ディレクトリをループする際の「間違った」方法です

って書いてありますね。。。理由は警告の通りです。


PHPはとっつきやすさ故か怪しいコードがたまにあるので
合わせて必ず公式を見るといいでしょう。*1

蛇足

前にはまっていた時は検索しても全然HITせず、途方にくれていたところ
実は公式の関数ごとのページ下部のコメントに答えが乗っていたという悲しいこともありました。。


他、いくら探しても解決法がなくてPHP自体のバグにはまっていたということもありましたがw
明らかに関数の挙動がおかしい場合はココを見ましょう。
PHP Bugs

*1:*公式にもバグはあるでしょうがね。。