1<?php
2/*
3 * This file is part of the File_Iterator package.
4 *
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
9 */
10
11/**
12 * Façade implementation that uses File_Iterator_Factory to create a
13 * File_Iterator that operates on an AppendIterator that contains an
14 * RecursiveDirectoryIterator for each given path. The list of unique
15 * files is returned as an array.
16 *
17 * @since     Class available since Release 1.3.0
18 */
19class File_Iterator_Facade
20{
21    /**
22     * @param  array|string $paths
23     * @param  array|string $suffixes
24     * @param  array|string $prefixes
25     * @param  array        $exclude
26     * @param  bool         $commonPath
27     * @return array
28     */
29    public function getFilesAsArray($paths, $suffixes = '', $prefixes = '', array $exclude = array(), $commonPath = FALSE)
30    {
31        if (is_string($paths)) {
32            $paths = array($paths);
33        }
34
35        $factory  = new File_Iterator_Factory;
36        $iterator = $factory->getFileIterator(
37          $paths, $suffixes, $prefixes, $exclude
38        );
39
40        $files = array();
41
42        foreach ($iterator as $file) {
43            $file = $file->getRealPath();
44
45            if ($file) {
46                $files[] = $file;
47            }
48        }
49
50        foreach ($paths as $path) {
51            if (is_file($path)) {
52                $files[] = realpath($path);
53            }
54        }
55
56        $files = array_unique($files);
57        sort($files);
58
59        if ($commonPath) {
60            return array(
61              'commonPath' => $this->getCommonPath($files),
62              'files'      => $files
63            );
64        } else {
65            return $files;
66        }
67    }
68
69    /**
70     * Returns the common path of a set of files.
71     *
72     * @param  array  $files
73     * @return string
74     */
75    protected function getCommonPath(array $files)
76    {
77        $count = count($files);
78
79        if ($count == 0) {
80            return '';
81        }
82
83        if ($count == 1) {
84            return dirname($files[0]) . DIRECTORY_SEPARATOR;
85        }
86
87        $_files = array();
88
89        foreach ($files as $file) {
90            $_files[] = $_fileParts = explode(DIRECTORY_SEPARATOR, $file);
91
92            if (empty($_fileParts[0])) {
93                $_fileParts[0] = DIRECTORY_SEPARATOR;
94            }
95        }
96
97        $common = '';
98        $done   = FALSE;
99        $j      = 0;
100        $count--;
101
102        while (!$done) {
103            for ($i = 0; $i < $count; $i++) {
104                if ($_files[$i][$j] != $_files[$i+1][$j]) {
105                    $done = TRUE;
106                    break;
107                }
108            }
109
110            if (!$done) {
111                $common .= $_files[0][$j];
112
113                if ($j > 0) {
114                    $common .= DIRECTORY_SEPARATOR;
115                }
116            }
117
118            $j++;
119        }
120
121        return DIRECTORY_SEPARATOR . $common;
122    }
123}
124