php получить полный путь к файлу в папке

У меня есть папка с именем data. В этой папке data находятся файлы и папки. В этих папках есть файлы и папки.... Продолжайте так...

Мне нужно получить все пути к файлам (включая файлы подкаталогов). У меня есть php-код:

function dirToArray($dir) {
    $contents = array();
    foreach (scandir($dir) as $node) {
        if ($node == '.' || $node == '.htaccess' || $node == '..' || $node == '.tmb' || $node == '.quarantine') continue;
        if (is_dir($dir . '/' . $node)) {
            $contents[$node] = dirToArray($dir . '/' . $node);
        } else {
            $contents[] = $node;
        }
    }
    return $contents;
}
$fileData = dirToArray( '/var/www/image/data/' );
print_r($fileData);

Вывод находится по этой ссылке. Это дает мне дерево папок data, подобное этому:

Array
(
    [04.2014] => Array
        (
            [C] => Array
                (
                    [0] => AMANFTR105260005_001.jpg
                    [Acki] => Array
                        (
                            [0] => 10269990_1407183112891667_859040604_n.jpg
                            [1] => 10287174_1407183106225001_914722369_n.jpg
                            [2] => 10307039_1407183109558334_889879385_n.jpg
                            [3] => 10318614_1407183099558335_776826424_n.jpg
                            [25763] => Array
                                (
                                    [0] => 10268126_1407184372891541_1399955485_n.jpg
                                    [1] => 10268256_1407184362891542_462829886_n.jpg
                                    [2] => 10318854_1407184356224876_1056593541_n.jpg
                                    [3] => photo.jpg
                                )

                            [73085] => Array
                                (
                                    [0] => 10261927_1407212376222074_295083908_n.jpg
                                    [1] => 10268368_1407212366222075_706285245_n.jpg
                                    [2] => 10299493_1407212372888741_1318245049_n.jpg
                                    [3] => 10318719_1407212379555407_451060715_n.jpg
                                )

Но я хочу этот массив:

Array
(
[0] => /var/www/image/data/04.2014/C/AMANFTR105260005_001.jpg
[1] => /var/www/image/data/04.2014/C/Acki/10269990_1407183112891667_859040604_n.jpg
[2] => /var/www/image/data/04.2014/C/Acki/10287174_1407183106225001_914722369_n.jpg

...

[223] => /var/www/image/data/logo.gif
)

person Aykhan Amiraslanli    schedule 10.04.2015    source источник
comment
Рассматривали ли вы возможность использования RecursiveDirectoryIterator? Вот пример.   -  person Elias    schedule 10.04.2015
comment
Вы вставляете $node в содержимое независимо от того, что из else satement, а это означает, что ваш второй оператор if, вероятно, не проходит, попробуйте отладить это.   -  person Siim Kallari    schedule 10.04.2015


Ответы (1)


Всего несколько комментариев.

То же, что и в ОП для @dyachenko. Вы проверяете is_dir() при добавлении $node в качестве имени файла для проверки, что означает, что это никогда не может быть правдой, поскольку вы всегда получаете файл. Во-вторых: dirToArray() внутри оператора if совершенно бессмысленно, потому что он ничего не делает, пока не будет запущено $content[] = $dir . '/' . $node, которое не будет запущено, если оператор if истинен.

Таким образом, правильный код будет таким:

function dirToArray($dir, &$contents) {

    foreach (scandir($dir) as $node) {
        if ($node == '.' || $node == '.htaccess' || $node == '..' || $node == '.tmb' || $node == '.quarantine') continue;
        if (is_dir($dir)) {
          $contents[] = $dir . '/' . $node;
        }
        else {
          //error or what ever
        }
    }

}

$contents = array();
dirToArray( '/var/www/html/UusProjekt/intl', $contents );
print_r($contents);
person Siim Kallari    schedule 10.04.2015