将平面数组转换为多维数组

Convert flat array to multidimensional array

想象一下有这样一个数组:

[
  'key1' => 'Label 1',
  'key2' => 'Label 2',
  'key3' => 'Label 3'
];

如何将其转换成这样的多维数组:

[
  'key1' => [
    'key1' => 'Label 1',
    'key2' => [
      'key2' => 'Label 2',
      'key3' => [
        'key3' => 'Label 3',
      ],
    ],
  ],
];

我想到了一些带有递归函数的东西 array_shift,但我不确定如何编码。

数组的嵌套深度应与元素的嵌套深度相同。

这是一种通过循环实现的方法,维护一个指向输出数组的指针,这样我们就可以简单地将值进一步推入其中:

$result = array();
$r = &$result;
foreach ($arr as $k => $v) {
    $r[$k] = array($k => $v);
    $r = &$r[$k];
}
print_r($result);

输出:

Array
(
    [key1] => Array
        (
            [key1] => Label 1
            [key2] => Array
                (
                    [key2] => Label 2
                    [key3] => Array
                        (
                            [key3] => Label 3
                        )
                )
        )
)

Demo on 3v4l.org

这里有一个递归的解决方案,只是为了好玩:

function nest(array $flat): array
{
   // base
   if (!$flat) return [];

   // recursive
   return [key($flat) => array_merge(array_splice($flat, 0, 1), nest($flat))];
}

在输入为空的基本情况下,您 return 一个空数组。

对于递归情况,你​​ return 一个 key/value 对

  • key = 输入的第一个键and
  • value = 第一个元素与嵌套剩余元素的结果合并