Вы путаете fnmatch и регулярные выражения в вашем коде. Чтобы получить все файлы и каталоги, кроме специальных, используйте это:
$dir_array = array_diff($dir_array, array(".", ".."));
В качестве альтернативы, если вы все равно итерируете массив, вы можете проверить каждый элемент следующим образом:
foreach ($dir_array as $name) {
if (($name != "..") && ($name != ".")) {
// Do stuff on all files and directories except . ..
if (is_dir($name)) {
// Do stuff on directories only
}
}
}
В php <5.3 вы можете исключительно <a href="http://php.net/manual/en/function.array-filter.php" rel="nofollow noreferrer"> использовать функцию обратного вызова , также:
$dir_array = array_filter($dir_array,
create_function('$n', 'return $n != "." && $n != ".." && is_dir($n);'));
(См. Ответ Аллена Лалонда для более подробной версии)
Начиная с php 5.3, это можно записать лучше :
$dir_array = array_filter($dir_array,
function($n) {return $n != "." && $n != ".." && is_dir($n);});
Наконец, объединение array_filter и первой строки кода этого ответа дает (незначительно) более медленную, но, вероятно, более читаемую версию:
$dir_array = array_filter(array_diff($dir_array, array(".", "..")), is_dir);