树(或层次)数组到二维结构化数组在php


Tree(or hierarchy) array to two dimensional structured array in php

如何将树状数组转换为二维线性数组?现在我仍然被这个问题困住了。也许有人会问这个问题,但我不知道如何回答。

$str='[{"id":1},{"id":2,"children":[{"id":3,"children":[{"id":4}]},{"id":5,"children":[{"id":6},{"id":7,"children":[{"id":8}]}]},{"id":9},{"id":10}]},{"id":11,"children":[{"id":12}]}]'

当我使用json_decode()函数将其转换为数组时,这是我的json字符串。我得到了以下结果

    Array
    (
        [0] => stdClass Object
            (
                [id] => 1
            )
        [1] => stdClass Object
            (
                [id] => 2
                [children] => Array
                    (
                        [0] => stdClass Object
                            (
                                [id] => 3
                                [children] => Array
                                    (
                                        [0] => stdClass Object
                                            (
                                                [id] => 4
                                            )
                                    )
                            )
                        [1] => stdClass Object
                            (
                                [id] => 5
                                [children] => Array
                                    (
                                        [0] => stdClass Object
                                            (
                                                [id] => 6
                                            )
                                    )
                            )
                        [2] => stdClass Object
                            (
                                [id] => 7
                            )
                        [3] => stdClass Object
                            (
                                [id] => 8
                            )
                    )
            )
        [2] => stdClass Object
            (
                [id] => 9
                [children] => Array
                    (
                        [0] => stdClass Object
                            (
                                [id] => 10
                            )
                    )
            )
    )

这是一个树形结构但我需要把它转换成一个二维数组,比如

 Array
    (
        [0] => Array
            (
                [parent] => 0
                [id] => 1
            )
        [1] => Array
            (
                [parent] => 0
                [id] => 2
            )
        [2] => Array
            (
                [parent] => 2
                [id] => 3
            )
        [3] => Array
            (
                [parent] => 3
                [id] => 4
            )
        [4] => Array
            (
                [parent] => 2
                [id] => 5
            )
        [5] => Array
            (
                [parent] => 5
                [id] => 6
            )
        [6] => Array
            (
                [parent] => 2
                [id] => 7
            )
        [7] => Array
            (
                [parent] => 2
                [id] => 8
            )
        [8] => Array
            (
                [parent] => 0
                [id] => 9
            )
        [9] => Array
            (
                [parent] => 0
                [id] => 10
            )
    )

您需要编写一个递归函数和/或循环来将您的对象排序到您指定的数组中。

我首先要说的是,在未来,如果你能发布样本数据和预期输出,实际上匹配你想要的和期望的,那将是伟大的-因为我刚刚花了十分钟的工作,为什么我的函数告诉我id 7的父是id 5,而你的例子说它应该是2,当你的JSON和你的示例数组实际上是不同的-讨厌。

无论如何,这是一个想法:

  • 递归函数,用于检查传入数组中的子元素。如果存在,则对其子函数再次调用该函数。无论是否存在子数组,都将当前值添加到输出数组中。
  • &$output =通过引用传递的输出变量,因此您不需要返回任何内容,并且无需全局调用即可访问输出变量。
  • $parent_id表示每次遍历子节点时的父节点id。在第一种情况下,节点没有父节点,声明$parent_id = 0将定义您的"默认"父节点ID。
function checkForChildrenOtherwiseAddToArray(&$output, $array, $parent_id = 0) {
    // loop through all sub-arrays inside this instance (if any)
    foreach($array as $each) {
        // check for children
        if(isset($each->children)) {
            // go deeper, passing in children and parent ID
            checkForChildrenOtherwiseAddToArray($output, $each->children, $each->id);
        }
        // add current iteration to array as well
        $output[] = array(
            'parent' => $parent_id,
            'id' => $each->id
        );
    }
}

使用例子:

$your_array = json_decode($str);
$output = array();
checkForChildrenOtherwiseAddToArray($output, $your_array);

由于该函数的递归性质,这将给您提供看似无序的结果。例如,要按id排序,您可以使用usort():

usort($output, function($a, $b) {
    return $a['id'] - $b['id'];
});

…您的示例输出将是:

Array
(
    [0] => Array
        (
            [parent] => 0
            [id] => 1
        )
    [1] => Array
        (
            [parent] => 0
            [id] => 2
        )
    [2] => Array
        (
            [parent] => 2
            [id] => 3
        )
    [3] => Array
        (
            [parent] => 3
            [id] => 4
        )
    [4] => Array
        (
            [parent] => 2
            [id] => 5
        )
    [5] => Array
        (
            [parent] => 5
            [id] => 6
        )
    [6] => Array
        (
            [parent] => 5
            [id] => 7
        )
    [7] => Array
        (
            [parent] => 7
            [id] => 8
        )
    [8] => Array
        (
            [parent] => 2
            [id] => 9
        )
    [9] => Array
        (
            [parent] => 2
            [id] => 10
        )
    [10] => Array
        (
            [parent] => 0
            [id] => 11
        )
    [11] => Array
        (
            [parent] => 11
            [id] => 12
        )
)