php中从树(或层次结构)数组到二维结构化数组的转换

php中从树(或层次结构)数组到二维结构化数组的转换,php,arrays,json,Php,Arrays,Json,如何将树状阵列转换为二维线性阵列?现在我仍然被这个问题困住了。也许有人会问这个问题,但现在我没有找到正确的方法 $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}]}]' 这是我使用jso

如何将树状阵列转换为二维线性阵列?现在我仍然被这个问题困住了。也许有人会问这个问题,但现在我没有找到正确的方法

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

    )
您需要编写一个和/或一个循环来将对象排序到一个与您指定的数组类似的数组中

我首先要说的是,在将来,如果你能发布样本数据和预期输出,这些数据和预期输出与你想要的和预期的结果相匹配,那将是非常好的-因为我刚刚花了十分钟的时间来研究为什么我的函数告诉我,当你的示例说应该是2时,id 7的父项是id 5,当你的JSON和你的示例数组实际上不一样的时候——令人讨厌

不管怎样,我的想法是:

  • 检查传递的数组中的子级。如果存在,请对其子函数再次调用该函数。将当前值添加到输出数组,而不管是否有子级
  • &$output
    =,因此无需返回任何内容,无需全局调用即可访问输出变量
  • $parent\u id
    表示每次迭代子对象时的父id。在节点没有父节点的第一种情况下,声明
    $parent\u id=0
    将定义您的“默认”父id。否则,每次深入时都会传递父id
示例用法:

$your_array = json_decode($str);
$output = array();
checkForChildrenOtherwiseAddToArray($output, $your_array);
由于该函数的递归性质,这将使您得到看起来不有序的结果。要按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
        )

)

你试过什么?您需要递归函数或循环,或者两者的组合。这真的不是一项困难的任务,但我建议你看看这里关于这方面的类似问题,因为我知道这种情况有很多问题和答案already@scrowler事实上,我真的被这个问题困住了。现在我还是不知道。。。
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
        )

)