• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPで、フォルダーにあるファイルを配列に取り込みたい)

PHPでフォルダー内のファイルを配列に取り込む方法

このQ&Aのポイント
  • PHPを使用して、指定したフォルダー内のファイルを配列に取り込む方法について教えてください。
  • 再帰関数を使用して、フォルダー内のサブフォルダーも含めたすべてのファイルを取得することができます。
  • 取得したファイルのパスを配列に格納して出力する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.5

ごめんなさい、修正です。 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 も同様(修正済みです)

noname#207939
質問者

お礼

さっそく使わせていただきます。ありがとうございました! 別件なのですが関連しているのでもし良ければこれも教えていただけないでしょうか? 次のようなフォルダー構造のとき(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 ) のようになって、フォルダー名やファイル名に特殊な文字(?)がある時、フォルダーが認識されません。 回避方法がありますでしょうか?

その他の回答 (5)

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.6

古い Linax 環境では、ファイル名に全角文字は使えなかったと思います。また、フォルダ名がそのまま URI として使用されるので、こちらもやはり古いブラウザでは未対応。 サーバー側で、影響のないように変換してくれているか、readdir が未対応か、 ファイル名に全角及び影響のある文字(; , / ? : @ & = + $ #)を使わないように気を使って付けたほうがいい、位しかいえないですね。

noname#207939
質問者

お礼

なるほど、そういう事なんですね。 いろいろ勉強になりました、ありがとうございました。

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.4

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 ); }

noname#207939
質問者

お礼

1階層しか得られなかったのと、{}が無いとParse errorになるのは他の原因でした、たいへん申し訳ありません。 return $files; を入れたら動きました、ありがとうございます。 ただし、次の様にフォルダー名にドットがある場合 /abc/z.txt /abc/def.ghi/z.txt 結果は次のようになりました。 $files = getfiles('./abc'); $files=Array ( [0] => def.ghi [1] => z.txt ) どうしてこうなるのでしょうか? 回避方法はありますでしょうか?

noname#207939
質問者

補足

closedir( $handle ); の下に return $files; を付けて動かしてみましたが、やはり得られた結果は1階層のみでした。 if ( is_dir( $file ) ) がパスを含んでいないからでしょうか?

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.3

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; }

noname#207939
質問者

補足

2行目の if ( $handle = opendir( $dir ) ) は if ( !$handle = opendir( $dir ) ) でしょうか? if文とwhile文に{}が無いとParse errorになります(PHPのバージョンでしょうか?) 得られた結果は1階層のみでした。 if ( is_dir( $file ) ) がパスを含んでいないからでしょうか? 参考にさせていただき考えてみます、ありがとうございました。

回答No.2

>$dir[/abc/a.txt] = "/abc/a.txt" >$dir[/abc/b.doc] = "/abc/b.doc" なぜキー値と同じ値を保持するのでしょう? キー値をそのままどうして使わないのでしょう?

noname#207939
質問者

補足

次のように階層ごとに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)
回答No.1
noname#207939
質問者

補足

scandirは1階層しか得られないので再帰関数が必要と思います。

関連するQ&A