2015-10-26 5 views
5

私は、あるアイテムが別のアイテムの子になることができるアイテムのツリーを作り、保存しようとしています。私は子供たちを見つけるために1つのレベル深く行くことができますコードの下で子の子を持つ配列をループする

[{"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}]}] 

:JSON

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

かのように:しかし、この子も、例えば私のような配列を取得していますので、子供などなどを持つことができますアクションを実行します。もちろん、子供がいる場合は別のものを追加することができますが、それは配列の一番下に来る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

はありがとうは、回答に –

答えて

3

は、コードの下に使用して、それを修正しました。

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

ありがとうを@Rankerし、私自身のQを回答:ここでは一例です。私はちょうど$ indentを使って何かをしているか分かりません –

+0

申し訳ありませんが、私が "else"ステートメントで$ indentを使って配列の深さを表示しています。else { echo "$ indent $ value \ n"; } –

+0

ソリューションを追加しました。高尚な男! –

関連する問題