PHP初心者 再帰処理について
あるフォルダ以下に含まれる全てのフォルダ名をフルパスですべて列挙するという処理を描こうと下記のブログを参考にして自分で少し書き換えたのですが、うまくいきません。
http://blog.asial.co.jp/12
<参考にした部分>
function getFileList($dir) {
$files = scandir($dir);
$files = array_filter($files, function ($file) { // 注(1)
return !in_array($file, array('.', '..'));
});
$list = array();
foreach ($files as $file) {
$fullpath = rtrim($dir, '/') . '/' . $file; // 注(2)
if (is_file($fullpath)) {
$list[] = $fullpath;
}
if (is_dir($fullpath)) {
$list = array_merge($list, getFileList($fullpath));
}
}
return $list;
}
</参考にした部分>
<自分で変更したコード>
function getFileList($dir) {
$files = scandir($dir);
$files = array_filter($files, function ($file) { // 注(1)
return !in_array($file, array('.', '..'));
});
$list = array();
foreach ($files as $file) {
$fullpath = rtrim($dir, '/') . '/' . $file;
if (is_dir($fullpath)) {
$list[] = $fullpath;
$list[] = array_merge($list, getFileList($fullpath));
}
}
return $list;
}
</自分で変更したコード>
変更といってもis_fileの部分の削除と$list[] = $fullpath;を追加しただけなのですが、「~ bytes exhausted」というエラーになってしまいます。
再帰関数が内部的にどういう処理をしているのかよくわかってないので、正直変更したコードがどういう動きをしているのかいまいち理解できません。参考書にある再帰関数は腑に落ちないながらも結果としてはそうなるということは理解しました。
あとそれ以前に $files = array_filter($files, function ($file) { return !in_array($file, array('.', '..')); の部分がわかりません。
scandirの戻り値には要素の最初の方に「.」と「..」が付くのでそれを削除する目的だとブログにはありますが、in_arrayはただ第一引数のものを第二引数から検索するだけのはずなのに、$filesの中身をarray_filtersの処理後に確認してみるとちゃんと「.」と「..」が削除されていて不思議です。あとin_arrayは第一引数のものを第二引数の中から検索するという関数だと思いますが、なぜそれをわざわざ反転させて((array('.', '..'), $file);じゃなく($file, array('.', '..'));)!in_arrayとしてるんでしょうか?
*ちなみに引用したブログのコードの動作は確認済みで元のコードは完全に正しいです。引用したコードに文句をつけているわけではなく自分がわかっていないだけです。(^^ゞ
以上です。よろしくお願いします。
補足
ファイルのパーミションを変更する場合、どうすればよいのでしょうか?