Вопрос по html, arrays, php – PHP-скрипт для обхода дерева каталогов / файлов и выходного дерева в виде вложенных UL [закрыт]

5

У меня есть дерево каталогов, подкаталогов и файлов (в некоторых, но не во всех каталогах). Вот пример всего дерева:

/food
/food/drinks
/food/drinks/water.html
/food/drinks/milk.html
/food/drinks/soda.html
/food/entrees
/food/entrees/hot
/food/entrees/hot/hamburger.html
/food/entrees/hot/pizza.html
/food/entrees/cold
/food/entrees/cold/icecream.html
/food/entrees/cold/salad.html
/cosmetics
/cosmetics/perfume
/cosmetics/perfume/chic.html
/cosmetics/perfume/polo.html
/cosmetics/perfume/lust.html
/cosmetics/lipstick
/cosmetics/lipstick/colors
/cosmetics/lipstick/colors/red.html
/cosmetics/lipstick/colors/pink.html
/cosmetics/lipstick/colors/purple.html

ОК, из сценария php в разделе "/"; каталог, я хочу просмотреть или пройти по этому дереву каталогов и распечатать дерево следующим образом:

<ul>
  <li>food</li>
    <ul>
      <li>drinks</li>
        <ul>
          <li>water.html</li>
          <li>milk.html</li>
          <li>soda.html</li>
        </ul>
      <li>entrees</li>
        <ul>
          <li>hot</li>
            <ul>
              <li>hamburger.html</li>
              <li>pizza.html</li>
            </ul>
          <li>cold</li>
            <ul>
              <li>icecream.html</li>
              <li>salad.html</li>
            </ul>      
        </ul>
    </ul>
  <li>cosmetics</li>
    <ul>
      <li>perfume</li>
        <ul>
          <li>chic.html</li>
          <li>polo.html</li>
          <li>lust.html</li>
        </ul>
      <li>lipstick</li>
        <ul>
          <li>colors</li>
            <ul>
              <li>red.html</li>
              <li>pink.html</li>
              <li>purple.html</li>
            </ul>
        </ul>
    </ul>
</ul>
Понятия не имею, почему модераторы закрыли это. вопрос супер ясен. Это 3-4 решения, некоторые из них еще не представлены. я ответил на что-то подобное здесь:stackoverflow.com/a/48550987/4481831 eliz82
Вы пытались это сделать? Niranjan

Ваш Ответ

4   ответа
8

Я думаю, что вам здесь нужноRecursiveDirectoryIterator отСтандартная библиотека PHP (SPL)

Затем вы можете написать что-то похожее на ниже:

function iterateDirectory($i)
{
    echo '<ul>';
    foreach ($i as $path) {
        if ($path->isDir())
        {
            echo '<li>';
            iterateDirectory($path);
            echo '</li>';
        }
        else
        {
            echo '<li>'.$path.'</li>';
        }
    }
    echo '</ul>';
}

$dir = '/food';
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));

iterateDirectory($iterator);
Error: User Rate Limit Exceededstackoverflow.com/a/10780023/991068
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded user743094
Error: User Rate Limit Exceeded
6

To get you started, it need the following functions to work:

  • opendir() to get the directory handler
  • readdir() to read it's content
  • is_dir() to determine if current value taken from readdir() is directory or files

To glue it all together, you will need:

Here's how it is after all resources above is glued:

<?php

function read_dir_content($parent_dir, $depth = 0){
    $str_result = "";

    $str_result .= "<li>". dirname($parent_dir) ."</li>";
    $str_result .= "<ul>";
    if ($handle = opendir($parent_dir)) 
    {
        while (false !== ($file = readdir($handle)))
        {
            if(in_array($file, array('.', '..'))) continue;
            if( is_dir($parent_dir . "/" . $file) ){
                $str_result .= "<li>" . read_dir_content($parent_dir . "/" . $file, $depth++) . "</li>";
            }
            $str_result .= "<li>{$file}</li>";
        }
        closedir($handle);
    }
    $str_result .= "</ul>";


    return $str_result;
}


echo "<ul>".read_dir_content("d:/movies/")."</ul>";
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded user743094
2

Я использую это, чтобы все файлы в директории:

function tree($path, $exclude = array()) {
    $files = array();
    foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $splfileinfo) {
        if (!in_array(basename($splfileinfo), $exclude)) {
            $files[] = str_replace($path, '', '' . $splfileinfo);
        }
    }
    return $files;
}
1

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

/*
     * Retern the file list which include in the given directory
     *
     * @param String $dirpath : Path to the directory
     * 
     * @access public
     * 
     * @return Array
     */
    function getFileList($dirpath)
    {
        $filelist = array();
        if ($handle = opendir(dirname ($dirpath))) 
        {
           while (false !== ($file = readdir($handle)))
              {
                    $filelist[] = $file;
              }
            closedir($handle);
        }

        return $filelist;
    }
Error: User Rate Limit Exceeded user743094
Error: User Rate Limit Exceeded

Похожие вопросы