如何将平面列表转换为嵌套数组?

时间:2015-07-16 16:23:51

标签: php arrays sorting multidimensional-array tree

我有平坦的数据:

Regex rg = new Regex("\\d+");
string test = "12345allo12345";
string result = rg.Replace(test, "");

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

我现在想要在嵌套数组中转换这个平面数组,以便结果如下:

$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', ], ], ], ]; foreach以多种方式迭代平面列表,没有任何工作接近工作,我的大脑现在受伤了。

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

2 个答案:

答案 0 :(得分:1)

$result = []; foreach($flatLists as $list) { $target = &$result; foreach($list as $element) { if(!isset($target[$element])) { $target[$element] = []; } $target = &$target[$element]; } } 不同,这会创建一个结构,其中leaves是具有空数组的键作为值:

{{1}}

答案 1 :(得分:1)

试试这个例子,虽然我看到你已经从@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 );