2015-10-26 92 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

添加解決方案。謝謝你! –