Обход папок и подпапок PHP

D
На сайте с 28.06.2008
Offline
1104
398

Нужно в указанной директории найти файлы и в подпапках тоже но только до 3 уровня вложенности. Написал так, но не получается остановить рекурсию в нужном месте.

В нужном месте цикл сначала видит директорию и только потом нужный файл. Если остановить - но файл в последней нужной директории не обработает.

Как быть?

т.е. проблема в том что цикл сначала заходит в подкатегорию и только потом сканирует файлы в этой категории, а нужно чтобы сначала файлы показывал потом уже шел на уровень ниже

$dir    = '/var/www/com/dir';

$level = 0;
function recursive($dir, $level)
{

    $odir = opendir($dir);

    while (($file = readdir($odir)) !== FALSE)
    {
        if ($file == '.' || $file == '..')
        {
            continue;
        }
        else
        {
            echo $dir.DIRECTORY_SEPARATOR.$file.PHP_EOL;
        }

        if (is_dir($dir.DIRECTORY_SEPARATOR.$file))
        {
            $level ++;
            var_dump($level);
            recursive($dir.DIRECTORY_SEPARATOR.$file, $level);
            if($level>3){
                break;
            }
        }
    }
    closedir($odir);
}

recursive($dir, $level);


Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#1

Так до $level или до 3го уровня?

Просто до 3го например так:

$l1=array_filter(glob("$dir/*"),'is_file');
$l2=array_filter(glob("$dir/*/*"),'is_file');
$l3=array_filter(glob("$dir/*/*/*"),'is_file');
$files=array_merge($l1,$l2,$l3);

Но можно конечно чуть переделать чтоб до переменной ($level) вложенности считывало.

D
На сайте с 28.06.2008
Offline
1104
#2
Евгений Крупченко #:

Так до $level или до 3го уровня?

Просто до 3го например так:

$l1=array_filter(glob("$dir/*"),'is_file');
$l2=array_filter(glob("$dir/*/*"),'is_file');
$l3=array_filter(glob("$dir/*/*/*"),'is_file');
$files=array_merge($l1,$l2,$l3);

Но можно конечно чуть переделать чтоб до переменной ($level) вложенности считывало.

Очень элегантно, спасибо!

lutskboy
На сайте с 22.11.2013
Offline
180
#3
Евгений Крупченко #:
$l1=array_filter(glob("$dir/*"),'is_file');
$l2=array_filter(glob("$dir/*/*"),'is_file');
$l3=array_filter(glob("$dir/*/*/*"),'is_file');
$files=array_merge($l1,$l2,$l3);

прикольно вышло

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий