将平面数组转换为多维数组
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
)
)
)
)
这里有一个递归的解决方案,只是为了好玩:
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 = 第一个元素与嵌套剩余元素的结果合并
想象一下有这样一个数组:
[
'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
)
)
)
)
这里有一个递归的解决方案,只是为了好玩:
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 = 第一个元素与嵌套剩余元素的结果合并