php - Laravel Format AllDirectories() 输出到树中

标签 php laravel

首先,我已经检查了所有可能的资源以获取示例,但无法找到足够接近的资源来解决此查询(看起来很简单)。 我还看到有一个相同但从未在这里解决的问题: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 集合和一些递归来实现您的需要。

我编写了一个函数,用于处理预处理输出(数组而不是纯字符串)并执行以下步骤:

  1. 获取所有给定路径并根据每条路径的第一段创建组。

  2. 对于每个创建的组,获取其子路径并从每个子路径中删除第一个段(过滤掉空路径)。

  3. 在子路径上执行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/

相关文章:

php - Laravel Eloquent 查询反射(reflect)基于另一个表数据的更新数据

javascript - 获取组件中的旧输入

php - 匹配用冒号、分号(可选)分隔的数字

php - 标记类字段

php - Laravel 5.5 - 将 MySQL 查询传递给 Javascript 函数/数据表

php - 拉维尔 5 + PostgreSQL : "Database [postgres] not configured." Error

php - Laravel Firebase 手机号码 (OTP) 身份验证

php - 循环动态值中的表

php - 从mysql中的表中删除连续的重复项

php - 仅显示每个月的第一个星期五可供选择 - jQuery UI Datepicker