【问题标题】:PHP string to multi level arrayPHP字符串到多级数组
【发布时间】:2016-10-31 10:53:29
【问题描述】:

如何转换这个*字符串:

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

在下面的数组中:

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

    )
)

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

谢谢!

【问题讨论】:

标签: php arrays recursion multidimensional-array


【解决方案1】:

不需要递归:

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

只需从内向外构建数组。

【讨论】:

  • 当然非常感谢所有其他人。感谢您的宝贵时间。
【解决方案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'

【讨论】:

    【解决方案3】:

    这是与其他迭代答案非常相似的方法,但会从 $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
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 2014-07-16
      • 2019-02-06
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 2016-01-09
      • 2012-04-24
      • 2014-10-11
      相关资源
      最近更新 更多