2017-10-05 22 views
1

私はオブジェクトの次の子の兄弟(親の次の子)を取得する最もクリーンな方法を探しています。Symfony/Sonataは次の子を取得する(兄弟)

-- Parent Object 
     -- Child 1 
     -- Child 2 (<== Current object) 
     -- Child 3 (<== Required object) 
     -- Child 4 

この例では、ページ(ソナタのページ)について説明しています。現在、私は2歳児を抱えており、同じ親の次のページ(この場合は子供3)が必要です。私が最後のページ(子供4)を持っている場合は、最初の子供がもう一度必要です。

1つのオプションは、親を要求し、すべての子を要求し、すべての子をループし、現在の子を探すことである。次の子を取るか、次の子がない場合は最初の子を取る。しかし、これは多くのコードのように思えますが、ロジックやループの場合は醜いです。だから私は、これを解決するためのいくつかの並べ替えのパターンがあるのだろうかと思っています。

答えて

0

は結局、私は次の解決策を考え出した:

/** 
* $siblings is an array containing all pages with the same parent. 
* So it also includes the current page. 
* First check if there are siblings: Check if the parent has more then 1 child 
**/ 
if (count($siblings) != 1) { 
     // Find the current page in the array 
     for ($i = 0; $i < count($siblings); $i++) { 

      // If we're not at the end of the array: Return next sibling 
      if ($siblings{$i}->getId() === $page->getId() && $i+1 != count($siblings)) { 
       return $siblings{$i+1}; 
      } 

      // If we're at the end: Return first sibling 
      if ($siblings{$i}->getId() === $page->getId() && $i+1 == count($siblings)) { 
       return $siblings{0}; 
      } 
     } 
    } 

これは、この問題に取り組むために、非常にきれいな解決策のように思えます。余分なループはなく、ロジックの場合でもコードは読み込み可能です。

関連する問題