PHPのプログラムで、あるディレクトリ以下のファイルを再帰的に一覧つくるもので手軽なのはあるでしょうか?

http://saboten009.blogspot.com/2008/01/phpscandir.html
などを参考にしてつくればできるのですが、できあいで何かあるでしょうか? 無限ループ対策をしてあるのがいいです。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/01/27 11:44:36
  • 終了:2008/01/27 15:28:01

ベストアンサー

id:tobeoscontinue No.1

tobeoscontinue回答回数214ベストアンサー獲得回数542008/01/27 15:03:59

ポイント60pt

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

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

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

id:isogaya

ありがとうございます。

2008/01/27 15:18:44

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません