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)って書くっぽい!
*/

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