【问题标题】:PHP - Create multidimensional recursive array from string (Files/folders structure)PHP - 从字符串创建多维递归数组(文件/文件夹结构)
【发布时间】:2023-11-04 01:52:01
【问题描述】:

10 年前有人问过同样的问题,但没有答案

参考:Trying to create Array from String (file/folder structure)


2022 年 1 月 8 日更新:数组和树应该是这样的:

https://3v4l.org/6ULBZ#v8.1.1

SQL 输出应该从一个字符串形成这个数组结构。

[
'id' => $key //Increment from foreach loop,
'file' => $row['name'] //Name of folders and files
'parent_id' => 0 // 0 - if no subfolder, $id if there is subfolder
]

我想从存储在数据库中的文件列表中返回一个树级多维数组作为字符串。

例如,我将工作相关路径存储在数据库中,如下所示:

SELECT name FROM files;

...SQL 输出

2021/Dec/File1.doc
2021/Dec/File2.doc
2021/Dec/File3.doc
2021/Nov/File1.doc
2021/Nov/File2.doc
2021/Nov/File3.doc
2021/Nov/File4.doc
2020/Jan/File1.doc
2020/Jan/File2.doc
2020/Jan/File3.doc

... PHP 递归数组输出应按文件夹、子文件夹、更多子文件夹(如果存在)和文件进行分类。

-2021
--Dec
---File1.doc
---File2.doc
---File3.doc
--Nov
---File1.doc
---File2.doc
---File3.doc
---File4.doc
-2020
--Jan
---File1.doc
---File2.doc
---File3.doc

实现这一性能的最佳方法是什么?

到目前为止我得到了什么......

$files = [];
foreach ($sql as $row)
{
    // Separate directories
    $separator = explode('/', $row['name']); 
    /* Output:
    Array
    (
    [0] => 2021
    [1] => Dec
    [2] => file1.doc
    )
    */

    // Find the file via regex
    if (preg_match('/[^\/]*\.(doc|txt)/', $row['name'], $o))
    {
        $row['name'] = $o[0]; //Output: file1.doc
    }
    $files[] = $row;
}

...现在我只有一个文件名,现在我还需要目录,然后从中创建一个多维数组。

【问题讨论】:

  • @CarySwoveland 你好。是的,但是我不想将子文件夹名称作为数组键,而是将其作为 parent_id => 'subfolder' 然后列出所有文件。像这样:*.com/questions/29384548/…
  • 添加到顶部数组和函数如何将数据库中的字符串形成数组。
  • 我假设——我不应该这样做——PHP 数组与其他语言中的数组几乎相同。我为我无端的转移道歉。

标签: php string recursion


【解决方案1】:
$files = [];
foreach ($sql as $row)
{
    // Separate directories
    $separator = explode('/', $row['name']); 
    /* Output:
    Array
    (
    [0] => 2021
    [1] => Dec
    [2] => file1.doc
    )
    */

    if (preg_match('/[^\/]*\.(doc|txt)/', $row['name']))
    {
        $node = &$files;
        while (count($separator) > 1) {
            $folder = array_shift($separator);
            if (!array_key_exists($folder, $node)) {
                $node[$folder] = [];
            }
            $node = &$node[$folder];
        }
        $node[] = $separator[0];
    }
}

【讨论】:

【解决方案2】:

我为您提供了一种解决方案,希望对您有所帮助。

$files="2021/Dec/File1.doc, 
2021/Dec/File2.doc,
2021/Dec/File3.doc,
2021/Nov/File1.doc,
2021/Nov/File2.doc,
2021/Nov/File3.doc,
2021/Nov/File4.doc,
2020/Jan/File1.doc,
2020/Jan/File2.doc,
2020/Jan/File3.doc";

$files=explode(',',$files);

foreach($files as $file)
{
    $i=1;
    $paths=explode('/',$file);
    foreach($paths as $path)
    {
        for($j=0;$j<$i;++$j){
            echo '-';
        }
        echo $path;
        echo "<br/>";
        ++$i;
    }
    $i=0;
}

您可以使用您的数据库文件。通过删除我的文件常量值并使用您的。

【讨论】:

  • 谢谢,但子文件夹没有合并,它们都是分开的,这违背了我需要的东西的目的