【问题标题】:How can I nest each item in an array within each other in PHP?如何在 PHP 中将每个项目嵌套在一个数组中?
【发布时间】:2022-01-16 00:54:40
【问题描述】:

如果我有以下数组:

[
  'foo',
  'bar',
  'baz' 
]

如何使用 PHP 动态获取此输出:

[
  'foo' => [
    'bar' => [
      'baz' => []
    ]
  ]
]

编辑

我最终通过向后构建数组并跟踪最后一个键来实现它,但我会对更简洁的递归方法感兴趣:

$arr = ['foo', 'bar', 'baz'];
$new_arr = [];
$last_key = null;

foreach ( array_reverse( $arr ) as $item ) {
    if ( $last_key ) {
        $new_arr[ $item ] = $new_arr;
        unset( $new_arr[ $last_key ] );
        $last_key = $item;
    } else {
        $new_arr[ $item ] = [];
        $last_key = $item; 
    }
}

【问题讨论】:

  • 使用递归是实现这一目标的方法之一。你做了什么来达到你的结果吗?这种没有任何尝试的问题往往会引起社区的负面反应
  • 也可以加入你的数组并使用 json_decode 3v4l.org/u3WS0

标签: php arrays associative-array


【解决方案1】:
$arr = [ 'foo', 'bar', 'baz' ];

$new_arr = array_reduce(array_reverse($arr), static fn($carry, $item) => [ $item => $carry ], []);

步骤:

  1. 反转数组。
  2. 减少反转数组。在每次迭代中返回 [ $item => $carry ]

【讨论】:

    【解决方案2】:

    试试这个:

    function buildNestedArray($arr) {
      if (!$arr) {
        return [];
      }
      return [ $arr[0] => buildNestedArray(array_slice($arr, 1))];
    }
    

    【讨论】:

      【解决方案3】:

      如果您想使用 foreach,您不必取消设置或使用 if/else。

      您可以反转$arr,并使用$arr 的值作为键将$new_arr(结果)包装在一个新数组中以进行每次迭代。

      $arr = [
          'foo',
          'bar',
          'baz'
      ];
      
      $new_arr = [];
      
      foreach(array_reverse($arr) as $v) {
          $new_arr = [$v => $new_arr];
      }
      
      print_r($new_arr);
      

      查看PHP demo

      输出

      Array
      (
          [foo] => Array
              (
                  [bar] => Array
                      (
                          [baz] => Array
                              (
                              )
      
                      )
      
              )
      
      )
      

      【讨论】:

      • 哈,我想这就是我想要做的,但我让它变得更复杂了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多