首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将分隔的字符串数组转换为键值数组

将分隔的字符串数组转换为键值数组
EN

Stack Overflow用户
提问于 2017-09-12 10:47:04
回答 2查看 61关注 0票数 1

我有一个数组的例子:

代码语言:javascript
复制
$roles = [
    "dashboard.read" => true,
    "dashboard.section1.read" => true,
    "members.member.create" => false,
    "members.member.read" => true,
    "members.member.view.update" => true,
    "members.member.view.section2.delete" => false,
    "members.member.view" => true
];

我需要一个方法来将类似结构的数组转换成这样的结果:

代码语言:javascript
复制
$roles = [
    "dashboard" => [
        "read" => true,
        "section1" => [
            "read" => true
        ]
    ],
    "members" => [
        "member" => [
            "create" => false,
            "read" => true,
            "view" => [
                "update" => true,
                "section2" => [
                    "delete" => false
                ],
                true,
            ],
        ]
    ]
];

我不知道该怎么做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-12 12:41:54

我把它作为一个挑战来解决你的问题,给你,我在代码中添加了所有的细节:

代码语言:javascript
复制
// your defined roles, as stated above
$roles = [
    "dashboard.read" => true,
    "dashboard.section1.read" => true,
    "members.member.create" => false,
    "members.member.read" => true,
    "members.member.view.update" => true,
    "members.member.view.section2.delete" => false,
    "members.member.view" => true
];

// the magic array, which will have all the results later
$magic = array();

// iterate trough all the roles
foreach($roles as $key => $value) {
    // split the roles and reverse the array, so we can start with setting the value
    $roleNamePart = array_reverse(explode(".", $key));

    // this array is used to recursive create all the array in itself
    $magicCreationArray = array();

    // iterate trough those role name parts starting at the "bottom"
    foreach($roleNamePart as $keypart) {

        // if it is empty, it is really the bottom and you can set the value right there
        if(empty($magicCreationArray)) {
            $magicCreationArray[$keypart] = $value;

        // if its not, it must be something inbetween, go one level up. its needed to create a temporary value for this, i guess
        } else {
            $tmp = $magicCreationArray;
            unset($magicCreationArray);
            $magicCreationArray[$keypart] = $tmp;
        }
    }
    // merge all the data to the magic array, use array_merge_recursive so it does not override for example "dashboard" 
    $magic = array_merge_recursive($magic, $magicCreationArray);
}

// here you go fam
print_r($magic);

希望我能帮你。

不错的读物:http://php.net/manual/en/function.array-merge-recursive.php

票数 1
EN

Stack Overflow用户

发布于 2017-09-12 13:02:26

它可以通过数组引用轻松地完成:

代码语言:javascript
复制
$input = [
    "dashboard.read" => true,
    "dashboard.section1.read" => true,
    "members.member.create" => false,
    "members.member.read" => true,
    "members.member.view.update" => true,
    "members.member.view.section2.delete" => false,
    "members.member.view" => true
];

$output = [];

foreach($input as $key => $value){
    $pointer =& $output;
    $keyParts = explode(".", $key);
    foreach(array_slice($keyParts, 0, -1) as $part){
        if(!isset($pointer[$part])) $pointer[$part] = [];
        $pointer =& $pointer[$part];

        // special case: If $key is a.b.c.d and a.b is already defined, convert the a.b value into an array
        if(!is_array($pointer)) $pointer = [$pointer];
    }
    $name = array_slice($keyParts, -1)[0];

    // special case: If $key is a.b and a.b.c.d is already defined, append to the array rather than overwriting it
    if(isset($pointer[$name])) $pointer[$name][] = $value;
    else $pointer[$name] = $value;
}

测试结果:

代码语言:javascript
复制
{
    "dashboard": {
        "read": true,
        "section1": {
            "read": true
        }
    },
    "members": {
        "member": {
            "create": false,
            "read": true,
            "view": {
                "update": true,
                "section2": {
                    "delete": false
                },
                "0": true
            }
        }
    }
}

我不知道我花了10分钟来调试members.member.view的特殊情况

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46174405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档