如果超过最大深度,如何将子数组(带对象)拉到父数组?

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

数据

我有这样的数据。

Array
(
    [0] => stdClass Object
        (
            [tid] => 1
            [t_name] => A
            [t_level] => 1
            [children] => Array
                (
                    [0] => stdClass Object
                        (
                            [tid] => 5
                            [t_name] => A.1
                            [t_level] => 2
                        )

                    [1] => stdClass Object
                        (
                            [tid] => 6
                            [t_name] => A.2
                            [t_level] => 2
                            [children] => Array
                                (
                                    [0] => stdClass Object
                                        (
                                            [tid] => 7
                                            [t_name] => A.2.1
                                            [t_level] => 3
                                            [children] => Array
                                                (
                                                    [0] => stdClass Object
                                                        (
                                                            [tid] => 9
                                                            [t_name] => A.2.1.1
                                                            [t_level] => 4
                                                            [array_val] => Array
                                                                (
                                                                    [0] => 0
                                                                    [1] => 1
                                                                    [2] => 2
                                                                )

                                                            [obj_val] => stdClass Object
                                                                (
                                                                )

                                                        )

                                                    [1] => stdClass Object
                                                        (
                                                            [tid] => 10
                                                            [t_name] => A.2.1.2
                                                            [t_level] => 4
                                                        )

                                                )

                                        )

                                    [1] => stdClass Object
                                        (
                                            [tid] => 8
                                            [t_name] => A.2.2
                                            [t_level] => 3
                                        )

                                )

                        )

                )

        )

    [1] => stdClass Object
        (
            [tid] => 2
            [t_name] => B
            [t_level] => 1
        )

    [2] => stdClass Object
        (
            [tid] => 3
            [t_name] => C
            [t_level] => 1
        )

    [3] => stdClass Object
        (
            [tid] => 4
            [t_name] => D
            [t_level] => 1
        )

)

原始数据转换为JSON:

[{"tid":1,"t_name":"A","t_level":1,"children":[{"tid":5,"t_name":"A.1","t_level":2},{"tid":6,"t_name":"A.2","t_level":2,"children":[{"tid":7,"t_name":"A.2.1","t_level":3,"children":[{"tid":9,"t_name":"A.2.1.1","t_level":4,"array_val":[0,1,2],"obj_val":{}},{"tid":10,"t_name":"A.2.1.2","t_level":4}]},{"tid":8,"t_name":"A.2.2","t_level":3}]}]},{"tid":2,"t_name":"B","t_level":1},{"tid":3,"t_name":"C","t_level":1},{"tid":4,"t_name":"D","t_level":1}]

它是 4 级深度,我想将所有深度超过 2 的子级拉到 2 级的父级列表中。

预期结果

Array
(
    [0] => stdClass Object
        (
            [tid] => 1
            [t_name] => A
            [t_level] => 1
            [children] => Array
                (
                    [0] => stdClass Object
                        (
                            [tid] => 5
                            [t_name] => A.1
                            [t_level] => 2
                        )

                    [1] => stdClass Object
                        (
                            [tid] => 6
                            [t_name] => A.2
                            [t_level] => 2
                        )

                    [2] => stdClass Object
                        (
                            [tid] => 7
                            [t_name] => A.2.1
                            [t_level] => 2
                        )

                    [3] => stdClass Object
                        (
                            [tid] => 9
                            [t_name] => A.2.1.1
                            [t_level] => 2
                            [array_val] => Array
                                (
                                    [0] => 0
                                    [1] => 1
                                    [2] => 2
                                )

                            [obj_val] => stdClass Object
                                (
                                )

                        )

                    [4] => stdClass Object
                        (
                            [tid] => 10
                            [t_name] => A.2.1.2
                            [t_level] => 2
                        )

                    [5] => stdClass Object
                        (
                            [tid] => 8
                            [t_name] => A.2.2
                            [t_level] => 2
                        )

                )

        )

    [1] => stdClass Object
        (
            [tid] => 2
            [t_name] => B
            [t_level] => 1
        )

    [2] => stdClass Object
        (
            [tid] => 3
            [t_name] => C
            [t_level] => 1
        )

    [3] => stdClass Object
        (
            [tid] => 4
            [t_name] => D
            [t_level] => 1
        )

)

JSON 中的预期结果:

[{"tid":1,"t_name":"A","t_level":1,"children":[{"tid":5,"t_name":"A.1","t_level":2},{"tid":6,"t_name":"A.2","t_level":2},{"tid":7,"t_name":"A.2.1","t_level":2},{"tid":9,"t_name":"A.2.1.1","t_level":2,"array_val":[0,1,2],"obj_val":{}},{"tid":10,"t_name":"A.2.1.2","t_level":2},{"tid":8,"t_name":"A.2.2","t_level":2}]},{"tid":2,"t_name":"B","t_level":1},{"tid":3,"t_name":"C","t_level":1},{"tid":4,"t_name":"D","t_level":1}]

代码

这是我尝试过的,但我不知道如何将它们移至父级。似乎没有函数/方法来设置父值或附加到父列表。

$maxDepth = 2;// max depth allowed.
$RAI = new \RecursiveArrayIterator($array);
$RII = new \RecursiveIteratorIterator($RAI, \RecursiveIteratorIterator::SELF_FIRST);
$RII->setMaxDepth($maxDepth);
foreach ($RII as $key => $value) {
    if ($key === 't_level' && intval($value) > $maxDepth) {
        // what to do? can't move them to their parent.
    }
}// endforeach;
unset($key, $value);
$array = $RII->getArrayCopy();

// see result.
print_r($array);
php arrays algorithm tree
1个回答
0
投票

我建议创建一个执行深度优先遍历的递归函数,它依赖于

$depth
参数来选择是使用递归结果数组来扩展展平数组,还是保留嵌套结构。

代码:

function flattenAtDepth($array, $depth) {
    $result = [];
    foreach ($array as $obj) {
        $rest = [];
        if (isset($obj->children)) {
            $obj = clone $obj;
            $children = flattenAtDepth($obj->children, $depth-1);
            if ($depth <= 1) {
                unset($obj->children);
                $rest = $children;
            } else {
                $obj->children = $children;
            }
        }
        array_push($result, $obj, ...$rest);
    }
    return $result;
}

致电:

$result = flattenAtDepth($array, $maxDepth);
© www.soinside.com 2019 - 2024. All rights reserved.