PHP-从字符串(文件/文件夹结构)创建多维递归数组



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

参考:尝试从字符串(文件/文件夹结构(创建数组


更新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;
}

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

$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];
}
}

我有一个解决方案给你,我希望这会有所帮助。

$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;
}

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

最新更新