【问题标题】:Dynamic PHP file array to list items动态 PHP 文件数组以列出项目
【发布时间】:2013-12-19 21:34:53
【问题描述】:

我目前正在从事自己的项目。其中一部分是,给出一个文件路径,它会在该路径/文件夹中搜索所有文件和子文件夹,并将它们添加到数组中。

此代码将文件路径“../”发送到函数 wps_files,并由此创建一个完整的多维数组。

HTML.php

<?php               
    echo '<pre>';
    print_r( wps_files('../') );
    echo '</pre>';
?>

这是 php 脚本中的函数。

<?php

function wps_files($path) {
    $wpsdir = Array(
        'Root' => $path,
        'Structure' =>  wps_glob($path)
    );
    return $wpsdir;
}

function wps_glob($dir) {
    foreach (glob($dir . '/*') as $f) {
        if(is_dir($f)) 
        {
            $r[] = array(basename($f) => wps_glob($f));
        } 
        else 
        {
            $r[] = basename($f);
        }
    }
    return $r;
}

现在我想创建一个精美的 css 文件树。 所以我的问题来了,我如何从这个数组中制作一个正确的书面列表? 如,

每个维度数组都标记在 &lt;ul&gt;&lt;/ul&gt; 内,并且该数组内的每个项目也被 &lt;li&gt;&lt;/li&gt; 包围,这很难解释,请参阅此代码。这是我想要实现的目标。

<ul>
    <li>ROOT[the file where the search for folders/files starts in]
        <ul>
            <li>Index.php[file inside root]</li>
            <li>Website[folder inside root]
            <li>
                <ul>
                    <li>HTML[folder inside Website]
                        <ul>
                            <li>Index.html</li>
                            <li>Contact.html</li>
                            <li>Info.html</li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

我一直在努力实现这一目标,但到目前为止一无所获。 帮助将不胜感激,当然还有解释。因为我是来学习的。不要复制粘贴。

非常感谢!

编辑:

这是当前显示的内容。它显示了数组中的每个文件,但顺序不正确。

0: Index.php
0: Javascript.js
1: Jquery.js
0: Get_Server_files.Script.php
0: General.css
1: Menu.css
2: Style.css
0: WelcomeImage0.png
1: WelcomeImage1.png
2: WelcomeImage2.png
3: WelcomeImage3.png
4: WelcomeImage4.png
5: WelcomeImage5.png
6: WelcomeImage6.png
WelcomeImages: 
0
1: bg.jpg
HTML: 
Javascript: 
Scripts: 
Style: 
images: 
0
1
2: New Text Document.txt
3
4
5

【问题讨论】:

    标签: php arrays file list dynamic


    【解决方案1】:

    意见:我建议采用输出多维数组,使用json_encode() 将其转换为JSON,然后在前端实现jsTree 之类的东西来处理可折叠节点。

    虽然从头开始编写这样的代码是可能的,但如果你之前已经完成了,那就是大量的工作。

    也就是说,如果您决定自己做,您会发现将数组输出为 JSON 会更容易在前端设置样式,因为它本身会转录为 Javascript 对象。

    还有一个#protip:如果您将结果作为 JSON 输出到单独的 PHP 文件中,请说您的代码结构如下...

    /index.php
    /data/json.php
    

    ...确保json.php 具有the correct header set


    新的解决方案,不错

    PHP 具有内置的 RecursiveDirectoryIteratorDomDocument 类。您可以一起使用它们来一次性完成整个递归文件夹转储。 非常感谢@Musaoriginal solution

    $dir = "/path/to/your/folder";
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
    
    $dom = new DomDocument("1.0");
    $list = $dom->createElement("ul");
    $dom->appendChild($list);
    $node = $list;
    $depth = 0;
    foreach($iterator as $name => $item)
    {  
        if ($iterator->getDepth() == $depth)
        {
            $li = $dom->createElement('li', $item->getFilename());
            $node->appendChild($li);
        }
        elseif ($iterator->getDepth() > $depth)
        {
            $li = $node->lastChild;
            $ul = $dom->createElement('ul');
            $li->appendChild($ul);
            $ul->appendChild($dom->createElement('li', $item->getFilename()));
            $node = $ul;
        }
        else
        {
            $difference = $depth - $iterator->getDepth();
            for ($i = 0; $i < $difference; $difference--)
                $node = $node->parentNode->parentNode;
            $li = $dom->createElement('li', $item->getFilename());
            $node->appendChild($li);
        }
        $depth = $iterator->getDepth();
    }
    echo $dom->saveHtml();
    

    旧解决方案,不太好:

    由于我们不这样做,但是,解决方案看起来像:

    function arrayToList($array) {
        $output = "<ul>";
        foreach($array as $key => $value)
            {
            if(!is_array($value))
            {
                $output = $output."<li>$key: $value</li>";
            }
            else 
                $output = $output."<li>$key".arrayToList($value)."</li>";
        }
        $output = $output."</ul>";
        return $output; 
    }
    

    像这样使用它:

    echo arrayToList($yourMultiDimensionalArray);
    

    【讨论】:

    • 非常感谢。我一定会在未来研究 JsTree。但是现在,我是一名二年级编程学校的学生,刚刚开始学习 php,我想自己创建它。不过谢谢,一定会调查的。
    • 好的,给你一些代码——它未经测试,但应该能让你开始。
    • 感谢您帮助我,目前无法测试。我要睡觉。明天早上会检查并反馈给您,非常感谢。
    • 没问题!祝你好运
    • 它有点工作,它显示了每个文件和文件夹。但顺序不对。将显示我的问题中显示的内容
    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2021-10-24
    • 2013-10-30
    • 1970-01-01
    相关资源
    最近更新 更多