【问题标题】:How to turn flat list into a nested array?如何将平面列表转换为嵌套数组?
【发布时间】:2015-07-16 16:23:51
【问题描述】:

我有平面数据:

$flatLists = [
    [
        'task',
        'updater',
        'updater_xml',
        'some_customer',
        'some_customer_de',

    ],
    [
        'task',
        'updater',
        'updater_xml',
        'some_customer',
        'some_customer_fr',
    ],
    [
        'task',
        'updater',
        'updater_json',
        'yet_another_customer',
        'yet_another_customer_us',
    ],
    [
        'task',
        'updater',
        'updater_json',
        'updater_flatfile',
    ],
];

它代表一个遗产结构,第一个元素是第一个父元素,每个条目都是一个子元素。

我现在想把这个平面数组转换成一个嵌套数组,这样结果看起来像:

$expectedArray = [
    'task' => [
        'updater' => [
            'updater_xml'  => [
                'some_customer' => [
                    'some_customer_de',
                    'some_customer_fr',
                ],
            ],
            'updater_json' => [
                'yet_another_customer' => [
                    'yet_another_customer_us',
                ],
                'updater_flatfile',
            ],
        ],
    ],
];

我已经尝试通过foreachfor 以多种方式迭代平面列表,但没有什么可以接近工作,现在我的大脑受伤了。

我不希望有一个有效的代码示例,但我希望能提供一些有关如何解决此问题的提示,并希望我能发布我自己的答案。现在,我被困住了。

【问题讨论】:

  • 平面列表中的每个条目是否总是有 4/5 个元素?还是可以是任意数量的元素?
  • @MariM 理论上条目的数量可能是无穷无尽的。
  • 叶子是否应该是值而不是键?
  • @Marek 我真的不介意它们是如何存储的。最后一个键既可以是值也可以是键,最后我确实介意维护树结构。

标签: php arrays sorting multidimensional-array tree


【解决方案1】:

与您的 $expectedArray 不同,这会创建结构,其中叶子是键,空数组作为值:

$result = [];
foreach($flatLists as $list) {
  $target = &$result;
  foreach($list as $element) {
    if(!isset($target[$element])) {
      $target[$element] = [];
    }
    $target = &$target[$element];
  }
}

【讨论】:

    【解决方案2】:

    试试这个例子,虽然我看到你已经从@Marek 那里得到了一个更简洁的解决方案。

    function recurse( &$out, $index, $values ) {
        if ( isset( $values[ $index + 1 ] ) ) {
            $out[ $values[ $index ] ] = array();
            recurse( $out[ $values[ $index ] ], $index + 1, $values );
        } else {
            $out[] = $values[ $index ];
        }
    }
    
    $out = array_map( function( $item ) {
        recurse( $temp, 0, $item );
        return $temp;
    }, $flatLists );
    
    
    $result = call_user_func_array( 'array_merge_recursive', $out );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 2017-10-11
      • 2012-03-27
      • 2016-11-16
      • 2021-08-11
      • 1970-01-01
      相关资源
      最近更新 更多