我有平坦的数据:
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
以多种方式迭代平面列表,没有任何工作接近工作,我的大脑现在受伤了。
我不希望有一个有效的代码示例,但我会很感激如何解决这个问题的一些提示,希望我能发布一个自己的答案。现在,我被困住了。
答案 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 );