PHP字符串到多级数组



如何转换这个*字符串:

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

插入到以下数组中:

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

*数组键的数量可能不同。除最后一个键外,每个数组键都代表array。

谢谢!

无需递归:

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

从内到外构建数组

这里有一种使用递归函数的方法。这是我个人最喜欢的,因为它有很好的可读性。

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'

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

相关内容

  • 没有找到相关文章

最新更新