こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

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としてるんでしょうか?

*ちなみに引用したブログのコードの動作は確認済みで元のコードは完全に正しいです。引用したコードに文句をつけているわけではなく自分がわかっていないだけです。(^^ゞ
以上です。よろしくお願いします。

投稿日時 - 2017-10-06 22:59:57

QNo.9382902

暇なときに回答ください

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

私もヒントだけ(汗

>in_arrayはただ第一引数のものを第二引数から検索するだけのはずなのに
(略)
>なぜそれをわざわざ反転させて

第一引数がファイル名の配列ではなくその中からひとつだけ取り出した「ファイル名」だからです(反転しているわけではないです)。で、第二引数に配列(要素は"."と"..")を指定して第一引数のファイル名がどちらかに該当するかどうかをチェックしています。

投稿日時 - 2017-10-07 17:20:54

お礼

ありがとうございます。
なるほどでした。リファレンスにはarray_filterはループしてますと書かないんですかね^^;
良ければ再帰処理の部分もヒントお願いします。

投稿日時 - 2017-10-07 23:04:55

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(2)

ANo.1

技術者志望と受け取って、後学のために。

var_dump(変数);

こんなんで、変数の中身が出力されます。

この直前に

echo '<pre>';

なんて書いておくと出力が見やすくなります。

ループがおかしくて何も出力されないなんて時には、

exit();

なんて書くとそこで処理は中断されます。

と言うことで、

>内部的にどういう処理をしているのかよくわかってない

上記のものをつかえばよくわかりますよ。

投稿日時 - 2017-10-06 23:50:49

お礼

ありがとうございます。

投稿日時 - 2017-10-07 23:01:42

-広告-
-広告-
-広告-
-広告-