展平多维数组PHP

时间:2018-09-25 19:43:20

标签: php arrays multidimensional-array

我需要展平一个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;
}

有什么想法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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));