首先,我已经检查了所有可能的资源以获取示例,但无法找到足够接近的资源来解决此查询(看起来很简单)。 我还看到有一个相同但从未在这里解决的问题:Get allDirectories() in Laravel and create a tree 我也将只使用相同的示例数据,因为它是完全相同的场景。
我基本上从 laravel 的 AllDirectories() 函数得到一个输出,输出是这样的:
array:20 [▼
0 => "test"
1 => "files"
2 => "files/2"
3 => "files/2/Blocks"
4 => "files/2/Blocks/thumbs"
5 => "files/shares"
]
我想把它转换成一个看起来像这样的多维数组:
[
["label" => "test", "path" => "test", "children" => []],
["label" => "files", "path" => "files", "children" =>
[
["label" => "2", "path" => "files/2", "children" =>
[
["label" => "Blocks", "path" => "files/2/Blocks", "children" =>
[
[
"label" => "thumbs", "path" => "files/2/Blocks/thumbs", "children" => []
]
]
]
]
],
["label" => "shares", "path" => "files/shares", "children" => []]
]
],
];
如何将 AllDirectories() 的输出转换为多维数组?
提前感谢您提供任何提示或技巧:)
最佳答案
您可以利用 laravel 集合和一些递归来实现您的需要。
我编写了一个函数,用于处理预处理输出(数组而不是纯字符串)并执行以下步骤:
获取所有给定路径并根据每条路径的第一段创建组。
对于每个创建的组,获取其子路径并从每个子路径中删除第一个段(过滤掉空路径)。
在子路径上执行
convertPathsToTree
函数,并将其输出结果分配给结果树结构的children
键。
代码如下:
function convertPathsToTree($paths, $separator = '/', $parent = null)
{
return $paths
->groupBy(function ($parts) {
return $parts[0];
})->map(function ($parts, $key) use ($separator, $parent) {
$childrenPaths = $parts->map(function ($parts) {
return array_slice($parts, 1);
})->filter();
return [
'label' => (string) $key,
'path' => $parent . $key,
'children' => $this->convertPathsToTree(
$childrenPaths,
$separator,
$parent . $key . $separator
),
];
})->values();
}
用法
首先,我们假设路径作为集合分配给 $data
变量:
$data = collect([
'test',
'files',
'files/2',
'files/2/Blocks',
'files/2/Blocks/thumbs',
'files/shares',
]);
您首先需要通过使用目录分隔符(在本例中为 /
)拆分每个路径来预处理数组。这可以通过简单的 map
调用来完成:
$processedData = $data->map(function ($item) {
return explode('/', $item);
});
然后,您可以使用上述函数并提供转换后的输入以获得请求的结构:
convertPathsToTree($processedData);
如果您更愿意获取输出数组而不是集合,请在 ->values()
调用之后添加 ->toArray();
功能。
关于php - Laravel Format AllDirectories() 输出到树中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69936159/