Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: /** Chris@0: * Façade implementation that uses File_Iterator_Factory to create a Chris@0: * File_Iterator that operates on an AppendIterator that contains an Chris@0: * RecursiveDirectoryIterator for each given path. The list of unique Chris@0: * files is returned as an array. Chris@0: * Chris@0: * @since Class available since Release 1.3.0 Chris@0: */ Chris@0: class File_Iterator_Facade Chris@0: { Chris@0: /** Chris@0: * @param array|string $paths Chris@0: * @param array|string $suffixes Chris@0: * @param array|string $prefixes Chris@0: * @param array $exclude Chris@0: * @param bool $commonPath Chris@0: * @return array Chris@0: */ Chris@0: public function getFilesAsArray($paths, $suffixes = '', $prefixes = '', array $exclude = array(), $commonPath = FALSE) Chris@0: { Chris@0: if (is_string($paths)) { Chris@0: $paths = array($paths); Chris@0: } Chris@0: Chris@0: $factory = new File_Iterator_Factory; Chris@0: $iterator = $factory->getFileIterator( Chris@0: $paths, $suffixes, $prefixes, $exclude Chris@0: ); Chris@0: Chris@0: $files = array(); Chris@0: Chris@0: foreach ($iterator as $file) { Chris@0: $file = $file->getRealPath(); Chris@0: Chris@0: if ($file) { Chris@0: $files[] = $file; Chris@0: } Chris@0: } Chris@0: Chris@0: foreach ($paths as $path) { Chris@0: if (is_file($path)) { Chris@0: $files[] = realpath($path); Chris@0: } Chris@0: } Chris@0: Chris@0: $files = array_unique($files); Chris@0: sort($files); Chris@0: Chris@0: if ($commonPath) { Chris@0: return array( Chris@0: 'commonPath' => $this->getCommonPath($files), Chris@0: 'files' => $files Chris@0: ); Chris@0: } else { Chris@0: return $files; Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns the common path of a set of files. Chris@0: * Chris@0: * @param array $files Chris@0: * @return string Chris@0: */ Chris@0: protected function getCommonPath(array $files) Chris@0: { Chris@0: $count = count($files); Chris@0: Chris@0: if ($count == 0) { Chris@0: return ''; Chris@0: } Chris@0: Chris@0: if ($count == 1) { Chris@0: return dirname($files[0]) . DIRECTORY_SEPARATOR; Chris@0: } Chris@0: Chris@0: $_files = array(); Chris@0: Chris@0: foreach ($files as $file) { Chris@0: $_files[] = $_fileParts = explode(DIRECTORY_SEPARATOR, $file); Chris@0: Chris@0: if (empty($_fileParts[0])) { Chris@0: $_fileParts[0] = DIRECTORY_SEPARATOR; Chris@0: } Chris@0: } Chris@0: Chris@0: $common = ''; Chris@0: $done = FALSE; Chris@0: $j = 0; Chris@0: $count--; Chris@0: Chris@0: while (!$done) { Chris@0: for ($i = 0; $i < $count; $i++) { Chris@0: if ($_files[$i][$j] != $_files[$i+1][$j]) { Chris@0: $done = TRUE; Chris@0: break; Chris@0: } Chris@0: } Chris@0: Chris@0: if (!$done) { Chris@0: $common .= $_files[0][$j]; Chris@0: Chris@0: if ($j > 0) { Chris@0: $common .= DIRECTORY_SEPARATOR; Chris@0: } Chris@0: } Chris@0: Chris@0: $j++; Chris@0: } Chris@0: Chris@0: return DIRECTORY_SEPARATOR . $common; Chris@0: } Chris@0: }