Изучение функции PHP scandir: игнорирование точечных файлов и каталогов

PHP предоставляет функцию scandir, которая позволяет разработчикам получать список файлов и каталогов в указанном каталоге. По умолчанию scandir возвращает все файлы и каталоги, включая файлы с точкой (файлы, начинающиеся с точки) и каталоги с точкой (каталоги с именем через точку). Однако в некоторых случаях вы можете исключить эти точечные файлы и каталоги из списка. В этой статье мы рассмотрим различные методы достижения этой цели и приведем примеры кода.

Метод 1: фильтрация с помощью регулярных выражений

$dir = '/path/to/directory';
$files = array_diff(scandir($dir), ['.', '..']);
$filteredFiles = preg_grep('/^[^.]/', $files);

В этом методе мы используем array_diffдля удаления записей текущего каталога (.) и родительского каталога (..) из результата сканирования.. Затем preg_grepиспользуется для фильтрации остальных файлов и каталогов, имена которых начинаются с точки (^[^.]/).

Метод 2. Фильтрация с помощью цикла

$dir = '/path/to/directory';
$files = scandir($dir);
$filteredFiles = [];
foreach ($files as $file) {
    if ($file[0] !== '.') {
        $filteredFiles[] = $file;
    }
}

Этот подход предполагает перебор результатов сканирования и создание нового массива вручную, исключая файлы и каталоги, начинающиеся с точки.

Метод 3: использование glob с GLOB_MARK

$dir = '/path/to/directory';
$files = glob($dir . '/*', GLOB_MARK);
$filteredFiles = array_filter($files, function ($file) {
    return substr($file, -1) !== '/';
});

Используя функцию glob с флагом GLOB_MARK, мы можем извлекать файлы и каталоги внутри каталога с косой чертой в конце для обозначения каталогов. Затем применяется array_filterдля удаления записей, заканчивающихся косой чертой, фактически исключая каталоги с точкой.

Метод 4. Рекурсивная фильтрация с помощью RecursiveDirectoryIterator

$dir = '/path/to/directory';
$filteredFiles = [];
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
foreach ($iterator as $file) {
    if ($file->isDot() || $file->getFilename()[0] === '.') {
        continue;
    }
    $filteredFiles[] = $file->getFilename();
}

Этот метод использует RecursiveDirectoryIterator и RecursiveIteratorIterator для рекурсивного обхода всех файлов и каталогов в указанном каталоге. Записи, представляющие собой точечные файлы или каталоги, пропускаются, а оставшиеся имена файлов добавляются в массив filteredFiles.

В этой статье мы рассмотрели несколько методов получения списка файлов и каталогов в PHP с использованием функции scandir, исключая при этом точечные файлы и каталоги. Мы рассмотрели подходы с использованием регулярных выражений, циклов, GLOB_MARK и рекурсивной фильтрации с помощью RecursiveDirectoryIterator. Используя эти методы, вы можете адаптировать списки файлов и каталогов, исключая при необходимости точечные файлы и каталоги.