【问题标题】:Recursive conversion to multidimensional array递归转换为多维数组
【发布时间】:2019-04-28 06:57:14
【问题描述】:

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

$s = 'a/b/c';

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

$result = [];

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

Print_r($result);

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

从行我们得到通常的一维数组,然后我们需要从这个数组中递归地创建一个多维数组,使用它的元素作为键

我的代码使用循环,问题是,我可以在没有循环的情况下解决类似的问题吗?

谢谢!

【问题讨论】:

  • 看看array_flip
  • @ChristhoferNatalius,你能详细说明你的意思吗?
  • without cycles 到底是什么意思?你正在使用一个 foreach,你想把它变成一个递归函数吗?
  • @Thefourthbird,我想在不使用循环的情况下获得相同的结果,但使用其他函数。
  • 你的意思是“没有foreach”?

标签: php arrays algorithm


【解决方案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 函数,因为这可以让我们不必先反转数组。

【讨论】:

  • 但是在array_reduce里面做array_reverse不是和嵌套foreach一样吗?而 OP 当前的解决方案只有 1 个 foreach。
  • @ChristhoferNatalius,我只是提供了一个替代方案,它没有按照 cmets 中的 OP 要求使用 forforeachwhile。显然,这些构造的内部解释涉及迭代。
猜你喜欢
  • 2021-07-19
  • 2015-05-30
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2017-12-28
相关资源
最近更新 更多