menu
書いてる野郎
orebike@gmail.com
何も指定しなければ、アルファベット順でファイルが列挙される。
GLOB_NOSORT
というオプションがあってこれを使うと、あえての不確定になる。
極限パフォーマンスを求める場合に使うのだろうか?
glob 関数はワイルドカードの **/*.php
このような表記に対応してないので、自作する。
再帰的処理になっていて、まず最初のループがディレクトリを片っ端から走査する動きになっている。
function get_file_path_list($dir_path){ $list = []; foreach(glob($dir_path . '*/', GLOB_ONLYDIR) as $sub_dir_path){ $list = array_merge($list, get_file_path_list($sub_dir_path)); } return array_merge($list, glob($dir_path . '*.php')); }
次のループがディレクトリ無いのファイルパス(例はphpファイル)をかき集めるものになっている。
どういう風に動くかが、プログラミング初心者にはわかりにくい。
まずディレクトリがあると最初のループに入ってしまう、つまり再帰処理に入ってしまう。 ということはこれはディレクトリを含まないディレクトリまでまず行ってしまうということ。
ディレクトリを含まないディレクトリまで来ると、もう最初のループは回らないので、初めて下のファイル取得する処理にくる。 前のループが回ってないので、空の配列に、そのディレクトリのファイル一覧が入って戻る。
これは再帰呼出しされているので、戻った先は一つ上の階層のループ処理になる。 戻りを現状の配列に合体して、次のループ、次のループと進む、そうすると自分の階層のディレクトリ全部のファイルが list に集まる。
そのループが終われば、自分自身のディレクトリの php ファイルを集めて、戻す、戻すともうひとつ上の階層のループ・・・
というように順々に取得して、最終的に根っこの呼び出しに全部のファイルパスの配列が揃う。