Исключить каталоги по отсутствующему файлу с 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 блок.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]