Php 如何将路径数组转换为具有不同深度的多维数组?

Php 如何将路径数组转换为具有不同深度的多维数组?,php,recursion,multidimensional-array,Php,Recursion,Multidimensional Array,我想打开一组路径,如下所示: $foo = [ 'a/b' => 1, 'a/c' => 2, 'x/y/0' => 4, 'x/y/1' => 5 ] 进入这样的多维数组,如下所示: $foo = [ 'a' => [ 'b' => 1, 'c' => 2], 'x' => [ 'y' => [0, 1] ] 路径数组可以包含任何深度的路径,可以是键值对,也可以是索引访问的普通数组。我尝试过递归,但不能完全理解这一点,尽管我

我想打开一组路径,如下所示:

$foo = [
 'a/b' => 1,
 'a/c' => 2,
 'x/y/0' => 4,
 'x/y/1' => 5
]
进入这样的多维数组,如下所示:

$foo = [
 'a' => [ 'b' => 1, 'c' => 2],
 'x' => [ 'y' => [0, 1]
]

路径数组可以包含任何深度的路径,可以是键值对,也可以是索引访问的普通数组。我尝试过递归,但不能完全理解这一点,尽管我感觉解决方案会很短。有什么想法吗

您可以使用引用在输出数组中进行更深的移动(并创建新的键),而无需递归。类似这样的方法会奏效:

function nest($arr){
    //our output array
    $out = array();

    //loop over the array and get each key/value
    foreach($arr as $k=>$v){
        //split the key
        $k = explode('/', $k);

        //create our first reference
        $tmp = &$out;

        //loop over the keys moving deeper into the output array
        foreach($k as $key){
            //if the key is not found
            if(!isset($tmp[$key])){
                //add it
                $tmp[$key] = array();
            }
            //get a reference to the sub-array
            $tmp = &$tmp[$key];
        }

        //here $tmp should be as far down the array as the value needs to be
        //set the value into the array
        $tmp = $v;
    }
    return $out;
}

演示:

4
5
发生了什么变化?
x
键不应该以
[4,5]
结尾,所以
0=4
1=5
?'x/y/0'=>4和'x/y/1'=>5意味着'x'=>'y'=>的值是一个数组,而不是一个映射/键值对。谈到这类事情,我希望这两个东西在PHP中有不同的名称,而不是都被称为“数组”,但是
'x/y/0'
x/y/1
中的
4
5
值发生了什么变化?它们只是消失,不再存在于建议的输出中。如何处理
x/y/0/test
?此外,您确实意识到,如果要对输出进行json编码,则具有从零开始的连续数字键的数组将转换为JS数组,而不是对象(
[]
,而不是
{}
)。如果您只想丢失该值(在
=>
的右侧),并将键中的最后一个值作为附加到输出的值,那么您可以在下面的代码中执行该操作。这是一个简单的测试。