- ベストアンサー
PHPでフォルダー内のファイルを配列に取り込む方法
- PHPを使用して、指定したフォルダー内のファイルを配列に取り込む方法について教えてください。
- 再帰関数を使用して、フォルダー内のサブフォルダーも含めたすべてのファイルを取得することができます。
- 取得したファイルのパスを配列に格納して出力する方法を教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
ごめんなさい、修正です。 function getfiles( $dir, $path='' ) { if ( !( $handle = opendir( $dir ) ) ) return false; $current_dir = getcwd( ); chdir( $dir ); $files = array( ); while ( $file = readdir( $handle ) ) { if ( $file == '.' || $file == '..' ) continue; if ( is_dir( $file ) ) array_splice( $files, count( $files ), 0, getfiles( $file, $path.$file.'/' ) ); else $files[] = $path.$file; } closedir( $handle ); chdir( $current_dir ); return $files; } > どうしてこうなるのでしょうか? if ( is_dir( $file ) ) がパスを含んでいない、あるいはパスが通ってないためです。表面化していませんが、opendir も同様(修正済みです)
その他の回答 (5)
- yuu_x
- ベストアンサー率52% (106/202)
古い Linax 環境では、ファイル名に全角文字は使えなかったと思います。また、フォルダ名がそのまま URI として使用されるので、こちらもやはり古いブラウザでは未対応。 サーバー側で、影響のないように変換してくれているか、readdir が未対応か、 ファイル名に全角及び影響のある文字(; , / ? : @ & = + $ #)を使わないように気を使って付けたほうがいい、位しかいえないですね。
お礼
なるほど、そういう事なんですね。 いろいろ勉強になりました、ありがとうございました。
- yuu_x
- ベストアンサー率52% (106/202)
function getfiles( $dir, $path='' ) { if ( !( $handle = opendir( $dir ) ) ) return false; $files = array( ); while ( $file = readdir( $handle ) ) { if ( $file == '.' || $file == '..' ) continue; if ( is_dir( $file ) ) array_splice( $files, count( $files ), 0, getfiles( $file, $path.$file.'/' ) ); else $files[] = $path.$file; } closedir( $handle ); }
お礼
1階層しか得られなかったのと、{}が無いとParse errorになるのは他の原因でした、たいへん申し訳ありません。 return $files; を入れたら動きました、ありがとうございます。 ただし、次の様にフォルダー名にドットがある場合 /abc/z.txt /abc/def.ghi/z.txt 結果は次のようになりました。 $files = getfiles('./abc'); $files=Array ( [0] => def.ghi [1] => z.txt ) どうしてこうなるのでしょうか? 回避方法はありますでしょうか?
補足
closedir( $handle ); の下に return $files; を付けて動かしてみましたが、やはり得られた結果は1階層のみでした。 if ( is_dir( $file ) ) がパスを含んでいないからでしょうか?
- yuu_x
- ベストアンサー率52% (106/202)
function getfiles( $dir, $path='' ) { if ( $handle = opendir( $dir ) ) return false; $files = array( ); while ( $file = readdir( $handle ) ) if ( $file == '.' || $file == '..' ) continue; if ( is_dir( $file ) ) { array_splice( $files, count( $files ), 0, getfiles( $file, $path.$file.'/' ) ); else $files[] = $path.$file; } closedir( $handle ); return $files; }
補足
2行目の if ( $handle = opendir( $dir ) ) は if ( !$handle = opendir( $dir ) ) でしょうか? if文とwhile文に{}が無いとParse errorになります(PHPのバージョンでしょうか?) 得られた結果は1階層のみでした。 if ( is_dir( $file ) ) がパスを含んでいないからでしょうか? 参考にさせていただき考えてみます、ありがとうございました。
- cistronezk
- ベストアンサー率38% (120/309)
>$dir[/abc/a.txt] = "/abc/a.txt" >$dir[/abc/b.doc] = "/abc/b.doc" なぜキー値と同じ値を保持するのでしょう? キー値をそのままどうして使わないのでしょう?
補足
次のように階層ごとに0,1,2,,,が得られたすると、上書きされるかなと思ったからです。 $dir[0] = "/abc/a.txt" $dir[1] = "/abc/b.doc" $dir[0] = "/abc/def/b.doc" $dir[0] = "/abc/ghi/a.txt" $dir[1] = "/abc/ghi/b.doc" 次の形が得られるのでしたら、それでもOKです。 $dir[0] = "/abc/a.txt" $dir[1] = "/abc/b.doc" $dir[2] = "/abc/def/b.doc" $dir[3] = "/abc/ghi/a.txt" $dir[4] = "/abc/ghi/b.doc"
- yuu_x
- ベストアンサー率52% (106/202)
補足
scandirは1階層しか得られないので再帰関数が必要と思います。
お礼
さっそく使わせていただきます。ありがとうございました! 別件なのですが関連しているのでもし良ければこれも教えていただけないでしょうか? 次のようなフォルダー構造のとき(Okwaveさんの方でエスケープされています) /abc/µ-Ziq/Lunatic Harness/01 Brace Yourself Jason.m4a /abc/Dvořák/01 Dvořák_ Symphony #9 In E Minor, O.m4a /abc/Yazz/The Natural Life/05 Which Way You Going Baby.m4a この関数をlinuxのレンタルサーバーで実行すると結果は $files = getfiles('./abc'); $files=Array ( [0] => Yazz/The Natural Life/05 Which Way You Going Baby.m4a ) この関数をローカルのWindowsXPで実行すると $files = getfiles('./abc'); $files=Array ( [0] => Dvořák [1] => Yazz/The Natural Life/05 Which Way You Going Baby.m4a [2] => μ-Ziq ) のようになって、フォルダー名やファイル名に特殊な文字(?)がある時、フォルダーが認識されません。 回避方法がありますでしょうか?