PHP字符串到多级数组

时间:2016-06-28 22:59:27

标签: php arrays recursion multidimensional-array

如何转换此*字符串:

$arrKeys = ['lev1', 'lev2', 'lev3'];
$val = 'foo';

进入以下数组:

Array
(
[lev1] => Array
    (
        [lev2] => Array
            (
                [lev3] => foo
            )

    )
)

*数组键的数量可能会有所不同。除最后一个之外的每个数组键代表数组。

谢谢!

3 个答案:

答案 0 :(得分:3)

不需要递归:

$arrKeys = array_reverse(['lev1', 'lev2', 'lev3']);
$val = 'foo';

$result = $val;

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

print_r($result); 

// Array
// (
//     [lev1] => Array
//     (
//         [lev2] => Array
//         (
//             [lev3] => foo
//         )
// 
//     )
// 
// )

只需从里到外构建数组。

答案 1 :(得分:2)

这是使用递归函数执行此操作的一种方法。这是我个人的最爱,因为它具有非常好的可读性。

function nest(array $keys, $value) {
  if (count($keys) === 0)
    return $value;
  else
    return [$keys[0] => nest(array_slice($keys, 1), $value)];
}

$result = nest(['key1', 'key2', 'key3'], 'foo');

print_r($result);

// Array
// (
//     [key1] => Array
//         (
//             [key2] => Array
//                 (
//                     [key3] => foo
//                 )
//         )
// )

或者您可以使用array_reduce执行此操作。这种方式也很不错,但这里增加了一点复杂性,因为必须首先反转键数组。

function nest(array $keys, $value) {
  return array_reduce(array_reverse($keys), function($acc, $key) {
    return [$key => $acc];
  }, $value);
}

$result = nest(['key1', 'key2', 'key3'], 'foo');

print_r($result);

// Array
// (
//     [key1] => Array
//         (
//             [key2] => Array
//                 (
//                     [key3] => foo
//                 )
//         )
// )

这两种解决方案适用于任意数量的密钥。即使$keys是一个空数组

nest([], 'foo'); //=> 'foo'

答案 2 :(得分:1)

这是与其他迭代答案非常类似的方法,但是在$arrKeys数组的末尾弹出值而不是在开头时将其反转。

$result = $val;    // start with the innermost value

while ($level = array_pop($arrKeys)) {
    $result = [$level => $result];      // build out using each key as a new level
}