2017-10-05 2 views
1

나는 개체의 다음 자식 (형제의 다음 자식)을 얻는 가장 깨끗한 방법을 찾고 있습니다.Symfony/Sonata 다음 어린이 찾기 (형제)

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

이 예에서는 페이지 (소나타 페이지)에 대해 이야기하고 있다고 가정 해 보겠습니다. 현재 저는 2 세 (자녀 2)이며 같은 부모 (이 경우에는 자녀 3)의 다음 페이지가 필요합니다. 마지막 페이지 (아이 4)가있는 경우 첫 번째 아이가 다시 필요합니다.

하나의 옵션은 부모를 요청한 다음 모든 자식을 요청하고 모든 자식을 반복하고 현재 자식을 찾는 것입니다. 그런 다음 다음 아이를 갖거나, 다음 아이가 없으면 첫 번째 아이를 데려 오십시오. 하지만 이것은 많은 코드처럼 보입니다. 논리와 루프라면 추악합니다. 그래서 이것을 해결할 수있는 패턴이 있는지 궁금합니다.

답변

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

이이 문제를 해결하기 위해 매우 깨끗한 솔루션처럼 보인다. 우리는 과도한 양의 루프를 가지고 있지 않으며 로직이라면 코드는 여전히 읽을 수 있습니다.