Hatena::ブログ(Diary)

ヒルズで働くholidays-lの技ログ このページをアンテナに追加 RSSフィード Twitter

2010年12月27日

[]PHPでディレクトリ一覧を取得するスマートではない方法

あるディレクトリに存在するディレクトリ一覧を取得する例。

<?php
$dirs = array();
if ($dh = opendir($dirName)) {
    while ($entry = readdir($dh)) {
        if (is_dir($entry) && $entry != "." && $entry != ".." ) {
            array_push($dirs, $entry);
        }
    }
    closedir($dh);
}

こんなんアホらしくて書いてられん。。。

カレントディレクトリならこれでOK。

<?php
$dirs = array_slice(array_filter(scandir('.', 0), is_dir), 2);

さて、$dirNameに対応するか。

<?php
$dirs = array_slice(array_filter(scandir($dirName, 0), is_dir), 2);

と、これが全くダメ。is_dirがfalse返してくる。

scandirがエントリ名だけ返してくるらしく、CWDから見たらそんなエントリは無いってことになってしまう。

そしてCWDからの相対パスを返してくれるオプションがねぇ。なんなんだよー。perlのFile::Findぐらい融通効かせてくれ。

とりあえずこんなんで行けるっちゃあ行ける。

<?php
$cwd = getcwd();
chdir($dirName);
$dirs = array_slice(array_filter(scandir(".", 0), is_dir), 2);
chdir($cwd);

けど、chdirしたくなかったので、

<?php
$dirs = (array_slice(array_filter(scandir($dirName, 0), create_function('$entry', 'return is_dir("' . $dirName . '/$entry");')), 2);
/*
$dirName = '...';
$dirs = array_slice(array_filter(scandir($dirName, 0), function($entry){return is_dir("$dirName/$entry");}), 2);
って書けないのもどうかと思うよ!!
→なんと!function($entry) use ($dirName)って書くっぽい!
*/

って・・・お寒い感じ。。。もうやだこの言語・・・。

BLUEPIXYBLUEPIXY 2010/12/27 20:08 5.3.0以降なら、書けますよ
参照:
http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures

holidays-lholidays-l 2010/12/28 09:44 さっき束縛変数を明示しないといけないのを初めて知りました。

BLUEPIXYBLUEPIXY 2010/12/29 03:57 ああ、use ですね。
変な書き方だけど、
もともと、関数外部の変数はglobal 宣言しないといけないし、それよりはマシかなと思います。
(そういう仕様にすれば余計なスコープ検索を減らせるということなんでしょう)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/holidays-l/20101227/p1