ファイル一覧を取得するとき、名前順じゃなくて更新日時で取得したい・・
そういう時は並び替え用の usort っていう関数を使うと簡単に並び替え可能です。
ここでは忘備録も兼ね、更新日時で並び替える方法とコード例について色々まとめてみました。
やり方はusortに並び替え用関数を渡すだけ
例えばあるディレクトリ中のファイルを更新日時順で並び替えし、その名前&更新日時を一覧で出力したい場合を考えてみます。例えば hoge.txt : 2019-04-12 12:29:01 みたいな感じで
その場合のやり方は次の通り
まず次のような並び替え用の関数を作成
1 2 3 |
$sort_by_lastmod = function($a, $b) { return filemtime($b) - filemtime($a); }; |
この関数の引数 $a 、 $b が比較したいファイルパスで、それを filemtme という更新日時を返す関数を使って新旧を比較してます。(例えば $a が新しければ 0 より大きい値、 $a が古ければ 0 未満の値が返ってくる)
そうしたらファイルリストを取得し、それを usort で並び替えればいいだけです。
実際にそういう処理をしているのが次のコード例
1 2 3 4 5 6 7 |
$files = glob( 'path/to/files/*.*' ); usort( $files, $sort_by_lastmod ); foreach( $files as $file ) { $timestamp = date('Y-m-d H:i:s', filemtime( $file ) ); echo basename( $file ) . ' : ' . $timestamp . '<br>'; } |
まず glob関数 で指定パスにあるファイルをワイルドカード( * )を使って検索
そして大事なのが usort( $files, $sort_by_lastmod ); の部分。ここで usort にファイルリストと先ほど作った関数を渡して更新日時順で並び替えるだけ
そうしたら後は名前と更新日時で出力していくだけです。
ちなみに、上コードの場合だと次のような感じでファイル一覧が出力できます。
1 2 3 4 5 6 |
piyo_02.txt : 2019-04-11 09:29:12 hoge_12.txt : 2019-04-05 19:10:50 hoge_07.txt : 2019-03-28 07:17:01 piyo_05.txt : 2019-03-21 12:50:14 piyo_14.txt : 2019-03-07 14:28:52 hoge_19.txt : 2019-03-01 21:31:02 |
ちゃんと更新が新しい順から古い順(すなわち昇順)で並んでるのが分かりますよね。
ちなみにここまでの全体のコードを載っけておくと次の通り
1 2 3 4 5 6 7 8 9 10 11 12 |
/// 更新日時順で並び替える関数 $sort_by_lastmod = function($a, $b) { return filemtime($b) - filemtime($a); }; /// 並び替えして出力 $files = glob( 'path/to/files/*.*' ); usort( $files, $sort_by_lastmod ); foreach( $files as $file ) { $timestamp = date('Y-m-d H:i:s', filemtime( $file ) ); echo basename( $file ) . ' : ' . $timestamp . '<br>'; } |
更新日時で並び替えというと難しそうですが、意外と簡単です。
補足 : ちなみにファイル名順で並び替えをするには・・
もちろん今紹介した更新日時ではなく、名前順でも並び替えできます。
やり方は先ほど同様、並び替え用の関数を作って usort に渡してあげればいいだけです。
例えば名前の昇順(a ⇒ z、あ ⇒ を)で並び替えしたい場合のコード例は次の通り
1 2 3 4 5 6 7 8 9 10 11 12 |
/// 名前の昇順で並べる関数 $sort_by_name = function($a, $b) { return strnatcmp($a, $b); }; /// 並び替えして一覧出力 $files = glob( '*.*' ); usort( $files, $sort_by_name ); foreach( $files as $file ) { $timestamp = date('Y-m-d H:i:s', filemtime( $file ) ); echo basename( $file ) . ' : ' . $timestamp . '<br>'; } |
並び替え用関数 $sort_by_name では strnatcmp という文字列用の比較関数で大小を比較してます。( $a が $b より大きいなら 0 より小さい値、逆なら 0 より大きい値が返る)
あとは usort( $files, $sort_by_name ); で比較してあげれば並び替えられるという訳です。
ちなみに上コードの出力例は次みたいな感じ
1 2 3 4 5 |
aaa.txt : 2019-01-02 08:11:45 aab.txt : 2019-03-12 12:30:21 aba.txt : 2019-02-05 16:51:19 bab.txt : 2019-02-29 13:22:30 caa.txt : 2019-04-22 20:12:07 |
上の出力例だと半角英数のみですが、日本語を含むファイル名でも正常に動きます(あんまりファイル名に日本語は使わない方がいいけど・・・)
ここまでのまとめ
以上、PHPでファイルを更新日時順で並び替える方法についてでした。
簡単なエクスプローラー的なものを作りたいときに便利かもです。ではでは(^_^)/~