- ベストアンサー
条件付きディレクトリツリー表示について
ある条件(例えばパーミッションや更新日付)でファイルを抽出し、ディレクトリツリーを表示したいと思っています。 http://www.sound-uz.jp/php/tips/file.html のページを参考(ディレクトリツリーの部分)に作っているのですが、条件を元にファイルを配列に入れても、そのフォルダに条件に当てはまるファイルが一つも無い(要素が無い)場合にもフォルダは表示されてしまいます。 配下にマッチするファイルが一つも無い場合は、上位のフォルダも表示させないようにするにはどうしたらいいのでしょうか? かなり困っていますのでご教授お願いします。 ---参考にプログラム掲載------ function showdirtree( $tree ) { if( !is_array( $tree ) ) // 配列でなければ false を返す return false; static $count = 0; // インデントの階層の深さ $indent = ( $count ) ? str_repeat( " ", $count ) : ""; $count++; foreach( $tree as $key => $value ) { if( is_array( $value ) ) { // 配列の場合ディレクトリ名を表示し再帰呼出 print( $indent."+ " . $key . "<br>\n" ); showdirtree( $value ); } elseif( preg_match( "/.*(\.html|\.txt|\.php)$/i", $value ) ) { // HTMLとTEXTとPHPのみアンカーをつけてファイル名を表示 print( $indent."- <a href=\"" . $value . "\" target=\"view\">" . $key . "</a><br />\n" ); } } $count--; return true; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
caitsith_gooさんと同じように、やはり取得側でやる処理だと思います。 function getdirtree( $dir ) { if( !is_dir( $dir ) ) // ディレクトリでなければ false を返す return false; $tree = array(); // 戻り値用の配列 if( $handle = opendir( $dir ) ) { while ( false !== $file = readdir( $handle ) ) { // 自分自身と上位階層のディレクトリを除外 if( $file != "." && $file != ".." ) { if( is_dir( $dir."/".$file ) ) // ディレクトリならば再帰呼出 $tmp = getdirtree( $dir."/".$file ); if(count($tmp)){ $tree[$file] = $tmp; } else if(preg_match( "/.*(\.html|\.txt|\.php)$/i", $file )) // ファイルならばパスを格納 $tree[ $file ] = $dir."/".$file; } } closedir( $handle ); uasort( $tree, "strcmp" ); // uasort() でないと添え字が失われます } return $tree; } こういうことではないでしょうか?
その他の回答 (2)
- caitsith_goo
- ベストアンサー率59% (28/47)
>[フォルダ1]-[フォルダ2]-[フォルダ3]-結局ファイル無し >の場合には、[フォルダ3]のみ消えるだけで、[フォルダ1]と[フォルダ2]は消えませんよね? >あわせて消したいと思っているのですが。。。 先ほど実際に参考サイトにあったものを変更してテストしてみたのですが、自分の環境ではそのような場合には全てのフォルダが格納されないようになりました。 再帰で子供のフォルダを先に見に行くので問題ないと思うのですが。。 試してみておかしいのであれば、その部分を書いていただけると助かります。
- caitsith_goo
- ベストアンサー率59% (28/47)
今ざっと見ただけでテストしてないので申し訳ないのですが、困り度3ということで。。 配列を表示する段階ではなく、配列を作成する段階で、ファイルがないフォルダを配列に格納しないようにするのはどうでしょうか。 参考サイトにある function getdirtree( $dir ) 内の処理で if( is_dir( $dir."/".$file ) ) // ディレクトリならば再帰呼出 $tree[ $file ] = getdirtree( $dir."/".$file ); else // ファイルならばパスを格納 $tree[ $file ] = $dir."/".$file; このような処理を行っていますが、 $tree[ $file ] = getdirtree( $dir."/".$file ); の部分を if (getdirtree( $dir."/".$file ) != array()) { $tree[ $file ] = getdirtree( $dir."/".$file ); } のように空の配列でない場合に$treeに格納するようにすればどうでしょうか。
お礼
早速の回答ありがとうございます。正直困っています。 ただ、 [フォルダ1]-[フォルダ2]-[フォルダ3]-結局ファイル無し の場合には、[フォルダ3]のみ消えるだけで、[フォルダ1]と[フォルダ2]は消えませんよね? あわせて消したいと思っているのですが。。。