递归转换为多维数组

时间:2018-11-26 15:29:00

标签: php arrays algorithm

我有一个问题,我有以下代码:

$s = 'a/b/c';

$array = array_reverse(explode('/', $s));

$result = [];

foreach($array as $key) {
    $result = [$key => $result];
}

Print_r($result);

(演示https://ideone.com/CJMvs0

从行中获得通常的一维数组,然后需要从该数组中递归创建一个多维数组,并使用其元素作为键

我的代码可以循环使用,问题是,我可以不用循环来解决类似的问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

这是一种递归的方式:

function nest($keys) {
    return count($keys) ? [$keys[0] => nest(array_slice($keys, 1))] : [];
}

$array = nest(explode('/', 'a/b/c')); // example

array_slice将获取不包含第一个元素的数组副本。可以通过在数组中传递 offset 来避免这种复制开销:

function nest($keys, $start = 0) {
    return $start < count($keys) ? [$keys[0] => nest($keys, $start+1)] : [];
}

$array = nest(explode('/', 'a/b/c')); // example

或者,更接近您的是,使用array_reduce

$array = array_reduce(array_reverse(explode('/', $s)), function ($acc, $key) {
    return [$key => $acc];
}, []);

可惜的是,PHP没有提供JavaScript中提供的array_reduce_right函数,因为这样可以使我们不必首先反转数组。