ディレクトリ内の全てのファイルを取得する

ひとつのフォルダにデータファイルを溜め込んで、一覧表示させたい事は良くあるので結構使う。

まず、ディレクトリを開く関数が
opendir
で、ファイル名を読み込む関数が
readdir
処理が終わったらお行儀良く
closedir
でフォルダを閉じる。
まとめると

<?php
$opendir = opendir('testfolder');
while($filename = readdir($opendir)){
 print ($filename . "<br>");
}
closedir($opendir);
?>

実際にやってみたら . と .. まで入っててなんじゃこりゃ。
使うなら使ったらいいのだが、ログ一覧とかで出すとしたら必要ない。
単純に . と .. なので文字列として除外し、そうでなければ代入する。
if($filename != "." and $filename != "..")
でいいと思うので、while内の処理を上のifで囲む感じ。


ファイル名から必要な部分だけを表示する

ログ表示にしても例えば20120603.txtみたいに書かれると微妙にかっこ悪い。
せっかくなので拡張子は取ってしまう。
そこで使う関数が
str_replace
で、指定した文字列を消してくれる。
まとめると

<?php
$opendir = opendir('testfolder');
$filecount = 0;
while($filename = str_replace(".txt","",readdir($opendir))){
 if($filename != "." and $filename != ".."){
  $replace_name[$filecount] = $filename;
  print ($replace_name[$filecount] . "<br>");
  $filecount++;
 }
}
closedir($opendir);
?>

str_replace("いらない文字" , "書き換えたい文字" , "ファイル名");
という感じで使うので、今回の場合は".txt"を""(何もなし)に書き換え、つまり消している。
whileで直接readdirしたうえstr_replaceしているがこういうやり方がいいのかは全く知らない。 その後 . と .. 以外であれば変数に格納している。 whileでファイルがあるだけやってくれるのだが、ここで$filecountという変数を持たせてついでに数を足し、数えている。 で、その数の配列にファイル名をいれている。 こうして数えた数は、一覧表示する時の行数などにも使える。 10件ずつとか100件ずつとかやりやすい。

蛇足だが、20120603を2012年6月3日みたいに書き換えたいのなら
substr(文字列 , ○バイト目の文字から , ○バイト目の文字まで);
という関数で指定の文字列から必要な文字を取り出すことができる。
上の例で言えば、printのところで
print (
substr($replace_name[$filecount] , 0 , 4) . "年" .
substr($replace_name[$filecount] , 5 , 2) . "月" .
substr($replace_name[$filecount] , 7 , 2) . "日" .
"<br>"
);
とすればいい。
ただ、06月とかなるのを6月としたい場合はちょっと面倒で、
単純に0を取ろうとすると10月が1月になってしまうし、日も同様。
年号は別に触らなくてもいいので、月と日だけ
if(substr($replace_name[$filecount] , 5 , 1) == "0"){
 print(substr($replace_name[$filecount] , 6 , 1));
}else[
 print(substr($replace_name[$filecount] , 5 , 2));
}
のようにすればいい。
これは月となる2桁のうち最初の1文字目が0であれば
6バイト目(月の2桁目)から1バイト取り出し、
そうでなければ
5バイト目から2バイト(2桁とも)取り出している。
同じように日は7バイト目が0であれば8バイト目を1文字、そうでなければ7バイト目から2文字取り出す。
まとめると

<?php
$opendir = opendir('testfolder');
$filecount = 0;
while($filename = str_replace(".txt","",readdir($opendir))){
 if($filename != "." and $filename != ".."){
  $replace_name[$filecount] = $filename;
  print (substr($replace_name[$filecount] , 0 , 4) . "年");
  if(substr($replace_name[$filecount] , 4 , 1) == "0"){
   print(substr($replace_name[$filecount] , 5 , 1) . "月");
  }else{
   print(substr($replace_name[$filecount] , 4 , 2) . "月");
  }
  if(substr($replace_name[$filecount] , 6 , 1) == "0"){
   print(substr($replace_name[$filecount] , 7 , 1) . "日");
  }else{
   print(substr($replace_name[$filecount] , 6 , 2) . "日");
  }
  print ("<br>");
  $filecount++;
 }
}
closedir($opendir);
?>

蛇足の割りに書き出したら長くなってしまった。
しかしここまでする必要があるかどうか。めんどいし。なんかもっといい方法ない?



サンプル

著作権について
ファイルからデータの読み込み
ファイルへのデータの書き込み
フォルダ内のファイル名取得
アクセスカウンターの作り方
アンケートの作り方
フォームからのデータの取得
フォーム以外のページからのデータの取得
ファイル内、文章内の文字列の検索
パスワード認証の方法と作り方

0から始めるPHP

PHPのすすめ(これ飛ばしてもいい)
必要な環境とPHPへのアクセス
開発に使うもの
初めての方への注意点
PHPの基本(何らかの言語経験者向け)
PHPの基本(初めての人向け)
書き方
ファイルの読み込み

プログラミング講座
文字などの出力
PHPにおける変数
ifによる条件比較
forによる繰り返し処理
PHPにおける配列
これまでとこれからの学び方

PHPの使える
おすすめレンタルサーバー

スタードメイン

レンタルサーバーの選び方


その他

プログラミングのコツ
プログラマーと年齢
誰でも簡単にできるサーバー負荷対策
社内や自宅サーバーのグローバルIPアドレスが変わってもアクセスできるようにする

日記

2014年
日本語形態素データとキーワード出現回数
Androidベースのゲーム機に期待
4月末に判明したIEの脆弱性について
フラッシュプレーヤーの製作
ホームページとウェブサイトの違い
WIFIなどの用語は正しく使いたい
国産ゲーム会社のサイトについて
検索エンジンの開発について
プレインストールWindowsからの脱却
Android・iPhoneとアプリ開発
Windows8、スタートボタンはもういらない?
サイトの作成とやるやらないは別
あの人は詳しいと言う人と言われる人
index.htmlと/の正規化について
AndroidOSとLinuxOS
モバイル端末で必ず見るもの
ユーザー参加型市民アプリ

2013年2月
2013年1月
2012年12月
2012年11月
2012年10月
2012年9月