人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPのプログラムで、あるディレクトリ以下のファイルを再帰的に一覧つくるもので手軽なのはあるでしょうか?
http://saboten009.blogspot.com/2008/01/phpscandir.html
などを参考にしてつくればできるのですが、できあいで何かあるでしょうか? 無限ループ対策をしてあるのがいいです。


●質問者: isogaya
●カテゴリ:インターネット ウェブ制作
✍キーワード:PHP あい なのは にしてつ ディレクトリ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● tobeoscontinue
●60ポイント ベストアンサー

>できあいで何かあるでしょうか?

できあいのものを知らないので無限ループ対策をして書いてみました。

function array_dirlist($path, $level=30) {
 $dirlist = array();
 if ($level) {
 $dh = opendir($path);
 while (($filename = readdir($dh))) {
 if ($filename == '.' || $filename == '..')
 continue;
 else {
 $realpath = $path.'/'.$filename;
 if (is_link($realpath))
 continue;
 else if (is_file($realpath))
 $dirlist[] = $filename;
 else if (is_dir($realpath))
 $dirlist[$filename] = array_dirlist($realpath, $level-1);
 } }
 closedir($dh);
 }
 return $dirlist;
}

指定したpathの内容を配列にして返します。ディレクトリーがあれば、それも配列にしているので入れ子状態となります。

無限ループ対策として再帰呼出しのたびに$levelをカウントダウンして0になれば処理しません。

また無限ループになる原因はリンクですのでis_link()で無条件にリンクのものは処理しないようにしています。処理の方針によってはそれでは不十分かもしれませんが。

また配列にため込んでいるので大きなディレクトリーだと問題になるかもしれません。目的がはっきりしているのなら

else if (is_file($realpath))

$dirlist[] = $filename;

の部分で$dirlist[] = $filename;をファイルに対してどうするかを記述したほうが処理は軽くなります。

function array_fullpath($path, $dirlist) {
 $fullpath = array();
 foreach ($dirlist as $id=>$filename) {
 if (is_array($filename))
 $fullpath = array_merge($fullpath, array_fullpath($path.'/'.$id, $filename));
 else
 $fullpath[] = $path.'/'.$filename;
 }
 return $fullpath;
}

array_dirlist()の返す配列は入れ子状態なので実際のパスを再現するにはちょっと面倒です。

array_fullpath()はarray_dirlist()の返す配列を処理するためのサンプルで、一次元のフルパスにして返します。

フルパスは長くなりがちなので大きなディレクトリーを指定すると処理できないかもしれません。

$path = '/home/hoge';
$dirlist = array_dirlist($path);
$fullpath = array_fullpath($path, $dirlist);

foreach ($fullpath as $path)
 echo $path."\n";

/home/hogeのファイルの一覧を表示します。

http://www.dummy.hatena.ne.jp

◎質問者からの返答

ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ