Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将平面数组转换为多维数组_Php_Arrays_Recursion_Multidimensional Array_Dynamic Arrays - Fatal编程技术网

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

Php 将平面数组转换为多维数组,php,arrays,recursion,multidimensional-array,dynamic-arrays,Php,Arrays,Recursion,Multidimensional Array,Dynamic Arrays,想象一下有这样一个数组: [ 'key1' => 'Label 1', 'key2' => 'Label 2', 'key3' => 'Label 3' ]; [ 'key1' => [ 'key1' => 'Label 1', 'key2' => [ 'key2' => 'Label 2', 'key3' => [ 'key3' => 'Label 3',

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

[
  'key1' => 'Label 1',
  'key2' => 'Label 2',
  'key3' => 'Label 3'
];
[
  'key1' => [
    'key1' => 'Label 1',
    'key2' => [
      'key2' => 'Label 2',
      'key3' => [
        'key3' => 'Label 3',
      ],
    ],
  ],
];
如何将其转换为如下多维数组:

[
  'key1' => 'Label 1',
  'key2' => 'Label 2',
  'key3' => 'Label 3'
];
[
  'key1' => [
    'key1' => 'Label 1',
    'key2' => [
      'key2' => 'Label 2',
      'key3' => [
        'key3' => 'Label 3',
      ],
    ],
  ],
];
我考虑过使用递归函数和数组移位,但我不确定如何编写它


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

这里有一种使用循环的方法,将指针保持在输出数组中,这样我们就可以将值进一步推入其中:

$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
                        )
                )
        )
)

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

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

   // recursive
   return [key($flat) => array_merge(array_splice($flat, 0, 1), nest($flat))];
}
在输入为空的基本情况下,返回一个空数组

对于递归情况,返回一个键/值对

  • 键=输入的第一个键,并且
  • value=与嵌套其余元素的结果合并的第一个元素

这里有一些类似的东西,只是它只创建命名键,而不是中间的数字键:您不需要递归,只需要一个循环。