2010-08-11 2 views
1

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

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

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

Вот функция:

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

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

  • @param $ filter_dir булева фильтр каталоги из результата (игнорируются, за исключением последнего каталога, если $ рекурсивного верно)

  • @param $ filter_files булев фильтр файлы из результата

  • @param $ исключить строку Pipe разделителей строки файлов, чтобы всегда игнорировать

  • @param $ рекурсивной булева каталог Descend на дно?

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

    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 из них отображаются. Echoing $ 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; 
} 

ответ

4

внимательно посмотреть на этой рутиной:

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

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

Если бы

print_r($array); 

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

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

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

+0

Хорошо, спасибо. Теперь отлично. – Baa

 Смежные вопросы

  • Нет связанных вопросов^_^