Просеивание через массив с детьми детей

Я пытаюсь создать и сохранить дерево предметов, где один элемент может быть ребенком другого. Но у этого ребенка также могут быть дети и т. Д. Так, например, я получаю массив вроде:

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

Рекурсия будет полезна. Вот пример:

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