PHPでディレクトリ内のファイルの一覧をツリー構造で取得する

  • PHP
  • 現在地

PHP5では opendir() と readdir() を使わずとも、scandir() で指定したディレクトリ直下のファイルを、一覧として取得できます。

今回は、この scandir() を使ってサブディレクトリからも一覧を取得し、ディレクトリをツリー構造で取得して表示してみました。

ディレクトリのファイルをサブディレクトリも含めて取得

ディレクトリの構造を取得するために、下記の関数 get_dir() を作成します。

関数 get_dir() で行っていること
  1. 引数として渡されたディレクトリパス ($path) から、 scandir() でファイル名やサブディレクトリ名の一覧を取得し、変数 $list に配列として格納。
  2. $path と $list に格納された全てのファイル名を組み合わせて、for文でディレクトリかどうか判別し、それがファイルならそのまま $dir に追加、それがディレクトリなら、そのサブディレクトリのパスを引数として再帰処理を行い、返り値をファイル名とともに配列として $dir に追加します。

    再帰処理(=関数自身の呼び出し)による返り値は、一度 $a に格納されますが、それが null (または '') だった場合は、ファイル名だけを $dir に格納しています。

  3. 最後に、ディレクトリの構造が格納された配列 $dir を返します。

なお、自身 (.) と親ディレクトリ (..) は必ず除外する必要があります。(無限ループに陥りますので。)

一覧取得用の関数
  • function get_dir($path){
    • $list = scandir($path);
    • $dir = array(); $length = count($list);
    • for($i=0; $i<$length; $i++){
      • if($list[$i] != '.' && $list[$i] != '..'){
        • if(is_dir($path.'/'.$list[$i])){
          • if(null != ($a = get_dir($path.'/'.$list[$i]))){
            • array_push($dir, array($list[$i],$a));
          • }else{
            • array_push($dir, $list[$i]);
          • }
        • }else{
          • array_push($dir, $list[$i]);
        • }
      • }
    • }
    • return $dir;
  • }
利用する際の一例
  • $path = './dir';
  • $dir = get_dir($path);

この関数から取得した配列を print_r() で表示してみると、サブディレクトリの部分は多次元配列としてディレクトリ名と構造を別にもち、ツリー状の構造となります。

といっても、配列のままHTMLに表示するわけにはいかないので、リスト形式のツリー構造として表示するための変換用関数を用意します。

取得したディレクトリの構造をHTMLでツリー状に表示

  • function list_dir($dir, $path){
    • if(null != $dir){
      • $list = '<ul>'; $length = count($dir);
      • for($i=0; $i<$length; $i++){
        • if(is_array($dir[$i])){
          • $list .= '<li>'.$dir[$i][0].list_dir($dir[$i][1], $path.'/'.$dir[$i][0]).'</li>';
        • }else{
          • $list .= '<li><a href="'.$path.'/'.$dir[$i].'">'.$dir[$i].'</a></li>';
        • }
      • }
      • $list .= '</ul>';
      • return $list;
    • }
  • }

この関数 list_dir() でリスト形式のディレクトリツリーとして表示できます。(ついでなのでファイルにリンクするようにしてみました。)

例えば、上記の get_dir() で取得した配列を表示する場合は、echo list_dir($dir, $path); で表示されます。

スポンサードリンク

inserted by FC2 system