Код для создания вложенного массива всех файлов в каталоге и подкаталогах с PHP не работает - PullRequest
1 голос
/ 12 августа 2010

Я пытаюсь использовать пример функции на веб-сайте руководства по PHP (опубликовано пользователем). Предполагается, что функция возвращает вложенный массив всех файлов и / или папок в указанном каталоге вашего сервера.

Я просто изучаю php, поэтому я думаю, что более вероятно, что я делаю что-то не так, и менее вероятно, что функция не работает. Но если есть более простой метод, чем приведенная ниже функция, пожалуйста, дайте мне знать.

Я могу перебирать и выводить все файлы в базовом пути, но не файлы в моей подпапке с примерами. Индекс, в котором должна быть подпапка, является пустым или просто именем папки, а не массивом в зависимости от параметров, которые я использую. Когда мне удалось получить имя папки, я протестировал его с помощью is_array, который вернул false.

Вот функция:

list_array: вернуть массив, содержащий необязательно все файлы, только каталоги или только файлы по пути файловой системы

  • @ param $ base_path строка либо абсолютный, либо относительный путь

  • @ param $ filter_dir boolean Фильтровать каталоги из результата (игнорируется, кроме последнего каталога, если $ recursive - true)

  • @ param $ filter_files логический Фильтр файлов из результата

  • @ param $ exclude string Строка файлов с разделителями в трубе, которую всегда следует игнорировать

  • @ param $ recursive boolean Спускать каталог вниз?

  • @ return $ result_list array Вложенный массив или false

    function directory_list($directory_base_path, $filter_dir = false, $filter_files = false, $exclude = ".|..|.DS_Store|.svn", $recursive = true){
    $directory_base_path = rtrim($directory_base_path, "/") . "/";
    
    if (!is_dir($directory_base_path)){
        error_log(__FUNCTION__ . "File at: $directory_base_path is not a directory.");
        return false;
    }
    
    $result_list = array();
    $exclude_array = explode("|", $exclude);
    
    if (!$folder_handle = opendir($directory_base_path)) {
        error_log(__FUNCTION__ . "Could not open directory at: $directory_base_path");
        return false;
    }else{
        while(false !== ($filename = readdir($folder_handle))) {
            if(!in_array($filename, $exclude_array)) {
                if(is_dir($directory_base_path . $filename . "/")) {
                    if($recursive && strcmp($filename, ".")!=0 && strcmp($filename, "..")!=0 ){ // prevent infinite recursion
                        error_log($directory_base_path . $filename . "/");
                        $result_list[$filename] = directory_list("$directory_base_path$filename/", $filter_dir, $filter_files, $exclude, $recursive);
                    }elseif(!$filter_dir){
                        $result_list[] = $filename;
                    }
                }elseif(!$filter_files){
                    $result_list[] = $filename;
                }
            }
        }
        closedir($folder_handle);
        return $result_list;
    }
    

    }

Вот одна из многих вещей, которые я пробовал. Массив содержит 5 элементов, но только 4 из них отображают. Вывод $ array [4] пуст. Я просто пытаюсь получить вложенный массив в этой точке. Но если есть более простой способ перебора, любые советы очень ценятся.

$directory_base_path = "../sandbox/";
$filter_dir = false;
$filter_files = false;
$exclude_files = ".|..|.DS_Store|dir_read_test.php";
$recursive = true;
$array = directory_list($directory_base_path, $filter_dir, $filter_files, $exclude_files, $recursive);
$array_length = count($array);
echo $array_length;
echo "<br/>";
$count = 0;

while ( $array_length >= $count ) {
 echo $array[$count];
 echo "<br/>";
 $count = $count + 1;
}

1 Ответ

4 голосов
/ 12 августа 2010

Внимательно посмотрите на эту процедуру:

    $result_list[$filename] = directory_list(/*recursive*/);
 else
    $result_list[] = $filename;

Какая разница?Рекурсивные записи помещаются в индекс $filename, а прямое содержимое - в индекс возрастающего целого числа, используя [].Ваш цикл будет показывать только индексы integer .

Если вы захотите

print_r($array);

, вы увидите все записи.(Или, конечно, вы можете заменить [$filename] на [].) Чтобы пройти через них самостоятельно, замените цикл while на

foreach ( $array as $k=>$v )
{
    echo "$k: $v<br/>";
}

(для поддиректора это покажет "subdir: Array", но это уже другая тема, вы можете протестировать is_array($v) и предпринять некоторые действия, основанные на этом)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...