展平多维数组 PHP

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

我需要展平 PHP 数组,但在获得所需结果时遇到一些问题。

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

                                    )

                            )

                    )

                [1] => Array
                    (
                        [case_code_id] => 4
                        [parent_id] => 1
                        [case_code] => Sub B
                        [sub_codes] => Array
                            (
                            )

                    )

            )

    )

[1] => Array
    (
        [case_code_id] => 2
        [parent_id] => 0
        [case_code] => Main B
        [sub_codes] => Array
            (
            )

    )

)

但我想将其转换为以下内容:

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
        [sub_codes] => Array
    )

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

这是我的循环:

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 multidimensional-array
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.