将分层多维数组转换为二维数组

问题描述 投票:0回答:3

我需要通过递归遍历每个数据子集并将它们推入结果数组,将分层多维数组转换为二维数组。

输入:

$multi = [
    [
        'case_code_id' => 1,
        'parent_id' => 0,
        'case_code' => 'Main A',
        'sub_codes' => [
            [
                'case_code_id' => 3,
                'parent_id' => 1,
                'case_code' => 'Sub A',
                'sub_codes' => [
                    [
                        'case_code_id' => 5,
                        'parent_id' => 3,
                        'case_code' => 'Sub Sub A',
                        'sub_codes' => []
                    ]
                ]
            ],
            [
                'case_code_id' => 4,
                'parent_id' => 1,
                'case_code' => 'Sub B',
                'sub_codes' => []
            ]
        ]
    ],
    [
        'case_code_id' => 2,
        'parent_id' => 0,
        'case_code' => 'Main B',
        'sub_codes' => []
    ]
]

想要的结果:

Array
(
    [0] => Array
    (
        [case_code_id] => 1
        [parent_id] => 0
        [case_code] => Main A
    )
    [1] => Array 
    (
        [case_code_id] => 3
        [parent_id] => 1
        [case_code] => Sub A
    )
    [2] => Array
    (
        [case_code_id] => 5
        [parent_id] => 3
        [case_code] => Sub Sub A
    )
    [3] => Array
    (
        [case_code_id] => 4
        [parent_id] => 1
        [case_code] => Sub B
    )
    [4] => Array
    (
        [case_code_id] => 2
        [parent_id] => 0
        [case_code] => Main B
    )
)

我尝试了几个循环,但没有返回完整的数组。

这是我的循环:

public function array_flatten($array, $list = array()) {
    for ($i = 0; $i < count($array); $i++) {
        $results[] = array(
            'case_code_id' => $array[$i]['case_code_id'],
            'case_code' => $array[$i]['case_code'],
            'parent_id' => $array[$i]['parent_id']
        );
        if (count($array[$i]['sub_codes']) > 0) {
            $this->array_flatten($array[$i]['sub_codes'], $results);
        } else {
            $results[] = $array[$i];
        }
    }
    return $results;
}

我这样称呼它:($multi 包含多维数组)

$flat = $this->array_flatten($multi); 

变量 $multi 是从此函数创建的:

public function build_case_code_tree(array $elements, $parentId = 0) {
    $branch = array();
    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = $this->build_case_code_tree($elements, $element['case_code_id']);
            $element['sub_codes'] = $children;
            $branch[] = $element;
        }
    }
    return $branch;
}

有什么想法吗?

php arrays recursion multidimensional-array hierarchical-data
3个回答
1
投票
function array_flatten($a, $flat = []) {
    $entry = [];
    foreach ($a as $key => $el) {
        if (is_array($el)) {
            $flat = array_flatten($el, $flat);
        } else {
            $entry[$key] = $el;
        }
    }
    if (!empty($entry)) {
        $flat[] = $entry;
    }
    return $flat;
}
print_r(array_flatten($multi));

0
投票

您没有在代码中的任何地方使用

$list
,并且没有任何内容通过引用传递。 你已经很接近了,但是你的函数应该使用
$list
代替
$results
,并且它应该通过引用接收
$list
并就地修改它而不是返回它。

类似这样的东西(虽然未经测试):

function array_flatten($array,&$list=array()){ for ($i=0;$i<count($array);$i++) { $list[] = array( 'case_code_id'=>$array[$i]['case_code_id'], 'case_code'=>$array[$i]['case_code'], 'parent_id'=>$array[$i]['parent_id'] ); if (count($array[$i]['sub_codes']) > 0) { $this->array_flatten($array[$i]['sub_codes'],$list); } else { $list[] = $array[$i]; } } }

并这样称呼它:

$flat = Array(); $this->array_flatten($multi, $flat); // Result is inside $flat now
    

0
投票
当您递归遍历所有级别并迭代每个子集时,暂时保留 sub_code 值,然后从子集中删除 sub_code 元素。将修剪后的子集推入结果数组,并将缓存的 sub_code 数据输入递归函数调用。

如果子级为空,则将返回一个空数组。如果一个空数组作为

array_push()

 的参数“传播”,则不会向数组添加任何内容。由于自定义函数调用仅返回子集的线性数组,因此在 
array_push()
 内部使用扩展运算符意味着递归调用永远不会创建不需要的深度。

代码:(

演示

function flatten(array $array): array { $result = []; foreach ($array as $v) { $subCode = $v['sub_codes']; unset($v['sub_codes']); array_push( $result, $v, ...flatten($subCode) ); } return $result; } var_export(flatten($array));
    
© www.soinside.com 2019 - 2024. All rights reserved.