private function flattenWithFilter(array $references, $regex, $flags = 0, $maxDepth = 0)
{
$result = array();
foreach ($references as $currentPath => $currentReferences) {
// Check whether the current entry matches the pattern
if (!isset($result[$currentPath]) && preg_match($regex, $currentPath)) {
// If yes, the first stored reference is returned
$result[$currentPath] = reset($currentReferences);
if ($flags & self::STOP_ON_FIRST) {
return $result;
}
}
if ($flags & self::NO_SEARCH_FILESYSTEM) {
continue;
}
// First follow any links before we check which of them is a directory
$currentReferences = $this->followLinks($currentReferences);
$currentPath = rtrim($currentPath, '/');
// Search the nested entries if desired
foreach ($currentReferences as $baseFilesystemPath) {
// Ignore null values and file paths
if (!is_dir($baseFilesystemPath)) {
continue;
}
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($baseFilesystemPath, RecursiveDirectoryIterator::CURRENT_AS_PATHNAME | RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST);
if (0 !== $maxDepth) {
$currentDepth = $this->getPathDepth($currentPath);
$maxIteratorDepth = $maxDepth - $currentDepth;
if ($maxIteratorDepth < 1) {
continue;
}
$iterator->setMaxDepth($maxIteratorDepth);
}
$basePathLength = strlen($baseFilesystemPath);
foreach ($iterator as $nestedFilesystemPath) {
$nestedPath = substr_replace($nestedFilesystemPath, $currentPath, 0, $basePathLength);
if (!isset($result[$nestedPath]) && preg_match($regex, $nestedPath)) {
$result[$nestedPath] = $nestedFilesystemPath;
if ($flags & self::STOP_ON_FIRST) {
return $result;
}
}
}
}
}
return $result;
}