首页 > 解决方案 > Laravel 集合拆分成多维数组

问题描述

我需要一个函数来将 Laravel 中的集合转换为多维数组,也许有人有这样的东西。

我拥有的是这个权限集合:

Illuminate\Support\Collection {#1190 ▼
  #items: array:10 [▼
    0 => "admin.users.view"
    1 => "admin.roles.create"
    2 => "admin.roles.view"
    3 => "admin.roles.edit"
    4 => "admin.roles.delete"
    5 => "admin.roles.set"
    6 => "admin.whitelist.edit"
    7 => "admin.ticket.view"
    8 => "admin.ticket.edit"
    9 => "admin.ticket.create"
  ]
}

现在我想按每个点拆分它,结果应该如下所示:

[
    "admin" => [
        "users" => [
            "view"
        ],
        "roles" => [
            "create",
            "view",
            "edit",
            "delete",
            "set"
        ],
        "whitelist" => [
            "edit"
        ],
        "ticket" => [
            "view",
            "edit",
            "create"
        ]
    ]
]

我知道应该可以使用映射或为其创建一个函数并制作一个 foreach 和类似的东西,但在花费数小时获得解决方案之前,我会问是否有人为它剪裁过。

预先感谢您对我们的支持。

来自德国 Patrick 的问候

标签: phparrayslaravel

解决方案


可能有更多的 Laravel 方法可以做到这一点。但是,以下代码将根据您提供的字符串创建一个嵌套数组。

$result = [];
foreach ($strings as $string) {
    // Assign back to the root (new start for current string)
    $previous = &$result;

    $pieces = explode('.', $string);
    $piecesCount = count($pieces);
    $lastIndex = $piecesCount - 1;

    for ($i = 0; $i < $piecesCount; $i++) {
        // Only interested in pushing the last piece as value.
        if ($i == $lastIndex) {
            $previous[] = $pieces[$i];

            continue;
        }

        if (!key_exists($pieces[$i], $previous)) {
            $previous[$pieces[$i]] = [];
        }

        // Go down the nested array by assigning its reference.
        $previous = &$previous[$pieces[$i]];
    }
}

结果:

Array
(
    [admin] => Array
        (
            [users] => Array
                (
                    [0] => view
                )
            [roles] => Array
                (
                    [0] => create
                    [1] => view
                    [2] => edit
                    [3] => delete
                    [4] => set
                )
            [whitelist] => Array
                (
                    [0] => edit
                )
            [ticket] => Array
                (
                    [0] => view
                    [1] => edit
                    [2] => create
                )
        )
)

推荐阅读