遍历一个包含子孙节点的数组

5

我正在尝试制作和保存一个项目树,其中一个项目可以是另一个项目的子项。但是这个子项也可以有子项等等。例如,我得到了一个数组,如下所示:

array(
    [0] array(
        'id' => 100
    ),
    [1] array(
        'id' => 101,
        'children' => array(
            [0] array(
                'id' => 103
            )
        )
    )
)

或者以JSON格式表示:
[{"id":1},{"id":3,"children":[{"id":4},{"id":5},{"id":6}]},{"id":2},{"id":7,"children":[{"id":8},{"id":9}]},{"id":10,"children":[{"id":11},{"id":12}]}][{"id":1},{"id":3,"children":[{"id":4},{"id":5},{"id":6}]},{"id":2},{"id":7,"children":[{"id":8},{"id":9}]},{"id":10,"children":[{"id":11},{"id":12}]}]

使用以下代码,我可以向下一级查找子元素并执行操作。当然,我可以添加另一个if(has children)语句,但这意味着需要大量的if和foreach语句来到达数组底部。特别是实际上子元素有时可能会延伸到10层深度。

public function sortPages(Request $request) {
    $data = json_decode($request->data);
    foreach($data as $sort=>$id) {
        $this->saveSortingOrder($id->id, $sort);
        if(isset($id->children)) {
            foreach($id->children as $sort_next=>$id_next) {
                $this->saveSortingOrder($id_next->id, $sort_next);
                $this->setParent($id_next->id, $id->id);
            }
        }
    }
}

有没有一种简单的方法来完成这项工作?

使用以下代码进行修复:

public function sortPages(Request $request) {
    $data = json_decode($request->data);
    foreach($data as $sort_value=>$id) {
        $this->saveSortingOrder($id->id, $sort_value);
        if(isset($request->parent)) {
            $this->setParent($id->id, $request->parent);
        }
        if(isset($id->children)) {
            $new_request = new Request;
            $new_request->data = json_encode($id->children);
            $new_request->parent = $id->id;
            $this->sortPages($new_request);
        }
    }
}

我自己回答了我的问题,感谢@Ranker。 - Alvin Bakker
1个回答

4

递归会很有帮助。这里有一个例子:

private function checkArrayRecursively($arr) 
{
    if ($arr) {
        foreach ($arr as $value) {
            if (is_array($value)) {
                // do something
                checkArrayRecursively($value);
            } 
        }
    }
 }

谢谢你的回答。我只是看不到你在哪里使用$indent。 - Alvin Bakker
抱歉,这是我的代码的一部分,在“else”语句中我使用了$indent来显示数组深度,当它到达末尾时像这样显示:else { echo "$indent $value \n"; } - Rafał Cz.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接