Исключить каталоги по отсутствующему файлу с Symfony Finder

Есть ли способ исключить папки, в которых отсутствуют некоторые файлы?

Например, у меня есть такие папки:

FolderA
    aaa.php
    bbb.php
    ccc.php

FolderB
    aaa.php
    bbb.php
    ccc.php

FolderC
    aaa.php

FolderD
    aaa.php
    bbb.php
    ccc.php

Я только хочу иметь FolderA, FolderB а также FolderD (или исключить FolderC) так как FolderC не все ожидаемые файлы

Источник тока

$dirs   = [];
$finder = new Finder();
$finder->directories()->in(__DIR__)->depth('== 0');
foreach ($finder as $directory){
        $dirs [] = $directory->getRelativePathname();
}
print_r($dirs);

Токовый выход:

array(
    [0] => FolderA
    [1] => FolderB
    [2] => FolderC
    [3] => FolderD
)

1 ответ

Наивный подход:

<?php

require_once(__DIR__.'/vendor/autoload.php');

use Symfony\Component\Finder\Finder;

$dirs   = [];
$finder = new Finder();
$finder->directories()->in(__DIR__)->depth('== 0');

$requiredFiles = ['aaa.php', 'bbb.php', 'ccc.php'];

foreach ($finder as $directory) {
    $fullPath = $directory->getPathname();

    // if one file is not in this directory, ignore this directory
    foreach ($requiredFiles as $requiredFile) {
        if (!file_exists($fullPath.'/'.$requiredFile)) {
            continue 2;
        }
    }

    $dirs[] = $directory->getRelativePathname();
}

print_r($dirs);

Это выведет это:

Array
(
    [0] => FolderD
    [1] => FolderB
    [2] => FolderA
)

Если вы хотите, чтобы папки были заказаны, просто позвоните sort($dirs); после foreach блок.

Другие вопросы по тегам