Php 将数组转换为多维数组

Php 将数组转换为多维数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个数组,看起来像这样: array:2 [ "test1_test2_test3" => "result" "category_slug" => "the_slug" ] array:2 [ "test1" => [ "test2" => [ "test3" => "result" ] ] "category" => [ "slug" =&g

我有一个数组,看起来像这样:

array:2 [
    "test1_test2_test3" => "result"
    "category_slug" => "the_slug"
]
array:2 [
    "test1" => [
        "test2" => [
            "test3" => "result"
        ]
    ]
    "category" => [
        "slug" => "the_slug"
    ]
]
我需要做的是将其转换为一个多维数组,其外观如下所示:

array:2 [
    "test1_test2_test3" => "result"
    "category_slug" => "the_slug"
]
array:2 [
    "test1" => [
        "test2" => [
            "test3" => "result"
        ]
    ]
    "category" => [
        "slug" => "the_slug"
    ]
]
我知道我可以按键分解得到一个数组,但我不确定如何从这开始到最后得到最终结果


EDIT数组最初看起来是这样的,因为它是从请求参数中提取的:
http://url.com?test1.test2.test3=result&category.slug=the_slug
和Laravel自动将其转换为数组。

我的方法是反转数组,然后循环键并嵌套它们

下面的代码应该可以做到这一点

$array = [
    "test1_test2_test3" => "result",
    "category_slug" => "the_slug"
];

$array = array_map(function ($key, $value) {
    $keys = array_reverse(explode('_', $key));
    while($key = array_shift($keys)) {
        $value = [$key => $value];
    }

    return $value;
}, array_keys($array), $array);

$array = call_user_func_array('array_merge', $array);
var_dump($array);

/**
array(2) {
    ["test1"]=>
    array(1) {
        ["test2"]=>
        array(1) {
            ["test3"]=>
            string(6) "result"
        }
    }
    ["category"]=>
    array(1) {
        ["slug"]=>
        string(8) "the_slug"
    }
}
*/
一条路要走:

$arr = array("test1_test2_test3" => "result", "category_slug" => "the_slug");
$res = array();

foreach($arr as $k=>$v) {

        $t = explode("_", $k);
        $new_arr = array();
        $tmp = $v; 
        for($i=count($t)-1; $i > 0; $i--) {
                $new_arr[$t[$i]] = $tmp;
                $tmp = $new_arr;
                $new_arr = array();
        }

        $res[$t[0]] = $tmp;

}

print_r($res);
结果:

Array
(
    [test1] => Array
        (
            [test2] => Array
                (
                    [test3] => result
                )

        )

    [category] => Array
        (
            [slug] => the_slug
        )

)
array:2 [
    "test1" => [
        "test2" => [
            "test3" => "result"
        ]
    ]
    "category" => [
        "slug" => "the_slug"
    ]
]
一个简单的解决方案:

$result = [];
foreach ($array as $key => $value) {
    foreach (array_reverse(explode('_', $key)) as $key_part) {
        $value = [$key_part => $value];
    }
    $result += $value;
}
如果需要使用相同的部件处理多个键(例如
test1\u test2\u test3
test1\u test2\u test4
),请将最后一行替换为:


$result=array\u merge\u recursive($result,$value)

查看Laravel文档时,我发现了一个助手
数组集
,这意味着为了将键更改为多维数组,我可以将键更改为使用点表示法和
str\u replace
,然后使用助手将其转换为:

$array = [
    "test1_test2_test3" => "result"
    "category_slug" => "the_slug"
]

$new_array = []

foreach($array as $key => $value)
{
    $key = str_replace('_', '.', $key);
    array_set($new_array, $key, $value);
}
结果:

Array
(
    [test1] => Array
        (
            [test2] => Array
                (
                    [test3] => result
                )

        )

    [category] => Array
        (
            [slug] => the_slug
        )

)
array:2 [
    "test1" => [
        "test2" => [
            "test3" => "result"
        ]
    ]
    "category" => [
        "slug" => "the_slug"
    ]
]

以您以后希望使用的方式创建数组不是更好吗?Dupe:可能的