2015-10-26 52 views
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和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); 
     } 
    } 
} 
+3

尝试递归... –

+0

回答我自己的Q,感谢名单以@Ranker –

回答

3

递归将是有益的。这里有一个例子:

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

thanx的答案。我只是没有看到你在做什么与$ indent –

+0

对不起,这是我的代码的一部分,我在“else”语句中使用$ indent来显示数组的深度,当它达到如此结束时:else { echo “$ indent $ value \ n”; } –

+0

添加解决方案。谢谢你! –